@atelierai/uco 1.0.6 → 1.0.8

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 (280) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +7 -8
  3. package/bin/server.mjs +1 -1
  4. package/bin/stub-plugin.mjs +3 -3
  5. package/dist/codegen/coerce.js +1 -1
  6. package/dist/codegen/coerce.js.map +1 -1
  7. package/dist/codegen/emit.js +2 -2
  8. package/dist/codegen/emit.js.map +1 -1
  9. package/dist/codegen/refs.js +1 -1
  10. package/dist/codegen/refs.js.map +1 -1
  11. package/dist/codegen/types.js +1 -1
  12. package/dist/codegen/types.js.map +1 -1
  13. package/dist/commands/call.js +1 -1
  14. package/dist/commands/call.js.map +1 -1
  15. package/dist/commands/devops/configure.js +1 -1
  16. package/dist/commands/devops/configure.js.map +1 -1
  17. package/dist/commands/devops/index.js +0 -4
  18. package/dist/commands/devops/index.js.map +1 -1
  19. package/dist/commands/devops/install-plugin.js +1 -1
  20. package/dist/commands/devops/install-plugin.js.map +1 -1
  21. package/dist/commands/devops/open.js +7 -7
  22. package/dist/commands/devops/open.js.map +1 -1
  23. package/dist/commands/devops/status.js +3 -3
  24. package/dist/commands/devops/status.js.map +1 -1
  25. package/dist/commands/exec.js +1 -1
  26. package/dist/commands/exec.js.map +1 -1
  27. package/dist/commands/install.js +2 -2
  28. package/dist/commands/install.js.map +1 -1
  29. package/dist/commands/prompt.js +2 -2
  30. package/dist/commands/prompt.js.map +1 -1
  31. package/dist/commands/resource.js +2 -2
  32. package/dist/commands/resource.js.map +1 -1
  33. package/dist/commands/update.js +1 -26
  34. package/dist/commands/update.js.map +1 -1
  35. package/dist/config/port.js +2 -2
  36. package/dist/config/port.js.map +1 -1
  37. package/dist/config/resolve.d.ts +1 -2
  38. package/dist/config/resolve.js +0 -12
  39. package/dist/config/resolve.js.map +1 -1
  40. package/dist/devops/lib/configure.d.ts +1 -1
  41. package/dist/devops/lib/configure.js +2 -2
  42. package/dist/devops/lib/configure.js.map +1 -1
  43. package/dist/devops/lib/install-plugin.d.ts +1 -1
  44. package/dist/devops/lib/install-plugin.js +1 -1
  45. package/dist/devops/lib/install-plugin.js.map +1 -1
  46. package/dist/devops/lib/install.d.ts +2 -2
  47. package/dist/devops/lib/install.js +5 -5
  48. package/dist/devops/lib/install.js.map +1 -1
  49. package/dist/devops/lib/open.js +11 -32
  50. package/dist/devops/lib/open.js.map +1 -1
  51. package/dist/devops/lib/remove-plugin.d.ts +1 -1
  52. package/dist/devops/lib/remove-plugin.js +3 -3
  53. package/dist/devops/lib/remove-plugin.js.map +1 -1
  54. package/dist/devops/lib/run-tool.d.ts +2 -2
  55. package/dist/devops/lib/run-tool.js +2 -2
  56. package/dist/devops/lib/types.d.ts +17 -54
  57. package/dist/devops/lib/types.js +2 -2
  58. package/dist/devops/lib/types.js.map +1 -1
  59. package/dist/devops/lib/update.d.ts +0 -15
  60. package/dist/devops/lib/update.js +2 -91
  61. package/dist/devops/lib/update.js.map +1 -1
  62. package/dist/devops/utils/agents.d.ts +0 -28
  63. package/dist/devops/utils/agents.js +0 -462
  64. package/dist/devops/utils/agents.js.map +1 -1
  65. package/dist/devops/utils/config.d.ts +9 -18
  66. package/dist/devops/utils/config.js +7 -20
  67. package/dist/devops/utils/config.js.map +1 -1
  68. package/dist/devops/utils/editor-cache.js +1 -1
  69. package/dist/devops/utils/editor-cache.js.map +1 -1
  70. package/dist/devops/utils/launch-error-dismiss.d.ts +2 -2
  71. package/dist/devops/utils/launch-error-dismiss.js +5 -5
  72. package/dist/devops/utils/manifest.d.ts +2 -2
  73. package/dist/devops/utils/manifest.js +3 -3
  74. package/dist/devops/utils/manifest.js.map +1 -1
  75. package/dist/devops/utils/port.d.ts +1 -1
  76. package/dist/devops/utils/port.js +1 -1
  77. package/dist/devops/utils/probe.d.ts +1 -1
  78. package/dist/devops/utils/probe.js +1 -1
  79. package/dist/devops/utils/ui.js +2 -2
  80. package/dist/devops/utils/ui.js.map +1 -1
  81. package/dist/devops/utils/unity-editor.js +4 -4
  82. package/dist/devops/utils/unity-editor.js.map +1 -1
  83. package/dist/devops/utils/unity-hub.js +1 -1
  84. package/dist/devops/utils/unity-hub.js.map +1 -1
  85. package/dist/devops/utils/unity-shutdown.d.ts +1 -1
  86. package/dist/devops/utils/unity-shutdown.js +1 -1
  87. package/dist/devops/utils/update-check.js +3 -3
  88. package/dist/devops/utils/update-check.js.map +1 -1
  89. package/dist/devops/utils/vendor.d.ts +2 -2
  90. package/dist/devops/utils/vendor.js +4 -4
  91. package/dist/devops/utils/vendor.js.map +1 -1
  92. package/dist/generated/tools.js +1 -1
  93. package/dist/generated/tools.js.map +1 -1
  94. package/dist/program.js +3 -3
  95. package/dist/program.js.map +1 -1
  96. package/dist/server/app.d.ts +5 -5
  97. package/dist/server/app.js +3 -3
  98. package/dist/server/app.js.map +1 -1
  99. package/dist/server/index.d.ts +2 -2
  100. package/dist/server/index.js +2 -2
  101. package/dist/server/index.js.map +1 -1
  102. package/dist/server/rest/auth.d.ts +1 -1
  103. package/dist/server/rest/auth.js +3 -3
  104. package/dist/server/rest/auth.js.map +1 -1
  105. package/dist/server/rest/context.d.ts +2 -2
  106. package/dist/server/rest/forward.d.ts +2 -2
  107. package/dist/server/session/store.d.ts +3 -3
  108. package/dist/server/session/store.js +4 -4
  109. package/dist/server/session/store.js.map +1 -1
  110. package/dist/server/stub-client/scenarios.js +8 -8
  111. package/dist/server/stub-client/scenarios.js.map +1 -1
  112. package/dist/server/types.d.ts +11 -11
  113. package/dist/server/types.js +9 -9
  114. package/dist/server/types.js.map +1 -1
  115. package/dist/server/ws/hub.d.ts +8 -8
  116. package/dist/server/ws/hub.js +13 -13
  117. package/dist/server/ws/hub.js.map +1 -1
  118. package/dist/server/ws/rpc.d.ts +3 -3
  119. package/dist/server/ws/rpc.js +4 -4
  120. package/dist/server/ws/rpc.js.map +1 -1
  121. package/dist/transport/index.d.ts +1 -1
  122. package/dist/transport/index.js +3 -3
  123. package/dist/transport/index.js.map +1 -1
  124. package/dist/transport/rest.js +1 -1
  125. package/dist/transport/rest.js.map +1 -1
  126. package/docs/INSTALL.zh-CN.md +2 -3
  127. package/package.json +1 -1
  128. package/skills/uco-setup/SKILL.md +1 -1
  129. package/skills/unity-editor/references/diagnostics.md +24 -24
  130. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetConfig.cs +132 -132
  131. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDependencyResolver.cs +237 -237
  132. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDownloader.cs +82 -82
  133. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/MenuItems.cs +247 -247
  134. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/ToolGroups.cs +153 -153
  135. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/SystemTool/Skills.Create.SkillBody.cs +155 -155
  136. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Console.GetLogs.cs +95 -95
  137. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Docs.HttpFetcher.cs +139 -139
  138. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Instance.ListAll.cs +72 -72
  139. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/PathReadHelper.cs +106 -106
  140. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Script.Validate.cs +252 -252
  141. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests/TestResultCollector.cs +537 -537
  142. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests.cs +400 -400
  143. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Branding/ProductInfo.cs +62 -62
  144. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/CopilotServerManager.cs +1034 -1034
  145. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Skills/Skill_InitialSetup.cs +197 -197
  146. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.Editor.cs +201 -201
  147. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.cs +67 -67
  148. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Components/ExtensionPanel.cs +379 -379
  149. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/MenuItems.cs +72 -72
  150. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/UnityCopilotProjectSettingsProvider.cs +64 -64
  151. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotListWindowBase.cs +393 -393
  152. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotWindowBase.cs +113 -113
  153. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.Connection.cs +3 -3
  154. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotFeatures.cs +195 -195
  155. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotServer.cs +372 -372
  156. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CreateGUI.cs +354 -354
  157. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.cs +78 -78
  158. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowInitializer.cs +47 -47
  159. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/SerializationCheckWindow.cs +190 -190
  160. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Build.cs +91 -91
  161. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Config.cs +298 -298
  162. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Static.cs +296 -296
  163. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.cs +69 -69
  164. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PackageUtils.cs +168 -168
  165. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PrefsKeyMigration.cs +119 -119
  166. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/SafeDefaultsGuard.cs +180 -180
  167. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ScriptUtils.cs +229 -229
  168. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolsManifestGenerator.cs +200 -200
  169. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringAdapters.cs +1467 -1467
  170. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringSafetyReloadGuard.cs +65 -65
  171. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityCopilotUpdateProjectSettings.cs +66 -66
  172. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/ReflectorNet.dll +0 -0
  173. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.Common.dll +0 -0
  174. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.dll +0 -0
  175. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Converter/Json/Structures/EntityIdConverter.cs +120 -120
  176. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.cs +110 -110
  177. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.pre-Unity.6.5.cs +110 -110
  178. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Unity/Logs/FileLogStorage.cs +547 -547
  179. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Build.cs +243 -243
  180. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Config.cs +175 -175
  181. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.cs +295 -295
  182. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginBuilder.cs +105 -105
  183. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.Static.cs +155 -155
  184. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.cs +59 -59
  185. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Utils/EnvironmentUtils.cs +368 -368
  186. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/AtomicApiTestFixtures.cs +99 -99
  187. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/TryModifyAtTests.cs +227 -227
  188. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AuthoringSafetyPilotTests.cs +1050 -1050
  189. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
  190. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +4 -4
  191. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/BlacklistTypeTests.cs +416 -416
  192. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.cs +172 -172
  193. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.pre-Unity.6.5.cs +169 -169
  194. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.cs +182 -182
  195. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.pre-Unity.6.5.cs +179 -179
  196. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.cs +175 -175
  197. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.pre-Unity.6.5.cs +174 -174
  198. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.cs +171 -171
  199. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.pre-Unity.6.5.cs +170 -170
  200. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsCreateFolderTests.cs +243 -243
  201. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsMaterialTests.cs +101 -101
  202. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs +348 -348
  203. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.pre-Unity.6.5.cs +348 -348
  204. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsShaderTests.cs +194 -194
  205. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.cs +573 -573
  206. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.pre-Unity.6.5.cs +513 -513
  207. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.cs +154 -154
  208. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.pre-Unity.6.5.cs +154 -154
  209. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotGameViewTests.cs +164 -164
  210. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotSceneViewTests.cs +155 -155
  211. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolParameterTests.cs +56 -56
  212. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.cs +651 -651
  213. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.pre-Unity.6.5.cs +651 -651
  214. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ToolBatchExecutionIntegrationTests.cs +407 -407
  215. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs → UcoPluginTests.cs} +105 -105
  216. package/vendor/plugin/com.atelierai.unity.copilot/package.json +1 -1
  217. package/dist/commands/devops/login.d.ts +0 -2
  218. package/dist/commands/devops/login.js +0 -29
  219. package/dist/commands/devops/login.js.map +0 -1
  220. package/dist/commands/devops/setup-mcp.d.ts +0 -2
  221. package/dist/commands/devops/setup-mcp.js +0 -41
  222. package/dist/commands/devops/setup-mcp.js.map +0 -1
  223. package/dist/devops/commands-upstream/bootstrap-local.d.ts +0 -17
  224. package/dist/devops/commands-upstream/bootstrap-local.js +0 -87
  225. package/dist/devops/commands-upstream/bootstrap-local.js.map +0 -1
  226. package/dist/devops/commands-upstream/close.d.ts +0 -57
  227. package/dist/devops/commands-upstream/close.js +0 -188
  228. package/dist/devops/commands-upstream/close.js.map +0 -1
  229. package/dist/devops/commands-upstream/configure.d.ts +0 -2
  230. package/dist/devops/commands-upstream/configure.js +0 -87
  231. package/dist/devops/commands-upstream/configure.js.map +0 -1
  232. package/dist/devops/commands-upstream/create-project.d.ts +0 -2
  233. package/dist/devops/commands-upstream/create-project.js +0 -43
  234. package/dist/devops/commands-upstream/create-project.js.map +0 -1
  235. package/dist/devops/commands-upstream/install-plugin.d.ts +0 -2
  236. package/dist/devops/commands-upstream/install-plugin.js +0 -64
  237. package/dist/devops/commands-upstream/install-plugin.js.map +0 -1
  238. package/dist/devops/commands-upstream/install-unity.d.ts +0 -2
  239. package/dist/devops/commands-upstream/install-unity.js +0 -72
  240. package/dist/devops/commands-upstream/install-unity.js.map +0 -1
  241. package/dist/devops/commands-upstream/login.d.ts +0 -2
  242. package/dist/devops/commands-upstream/login.js +0 -33
  243. package/dist/devops/commands-upstream/login.js.map +0 -1
  244. package/dist/devops/commands-upstream/open.d.ts +0 -32
  245. package/dist/devops/commands-upstream/open.js +0 -282
  246. package/dist/devops/commands-upstream/open.js.map +0 -1
  247. package/dist/devops/commands-upstream/remove-plugin.d.ts +0 -2
  248. package/dist/devops/commands-upstream/remove-plugin.js +0 -41
  249. package/dist/devops/commands-upstream/remove-plugin.js.map +0 -1
  250. package/dist/devops/commands-upstream/run-system-tool.d.ts +0 -1
  251. package/dist/devops/commands-upstream/run-system-tool.js +0 -13
  252. package/dist/devops/commands-upstream/run-system-tool.js.map +0 -1
  253. package/dist/devops/commands-upstream/run-tool-builder.d.ts +0 -25
  254. package/dist/devops/commands-upstream/run-tool-builder.js +0 -125
  255. package/dist/devops/commands-upstream/run-tool-builder.js.map +0 -1
  256. package/dist/devops/commands-upstream/run-tool.d.ts +0 -1
  257. package/dist/devops/commands-upstream/run-tool.js +0 -13
  258. package/dist/devops/commands-upstream/run-tool.js.map +0 -1
  259. package/dist/devops/commands-upstream/setup-mcp.d.ts +0 -2
  260. package/dist/devops/commands-upstream/setup-mcp.js +0 -68
  261. package/dist/devops/commands-upstream/setup-mcp.js.map +0 -1
  262. package/dist/devops/commands-upstream/setup-skills.d.ts +0 -2
  263. package/dist/devops/commands-upstream/setup-skills.js +0 -167
  264. package/dist/devops/commands-upstream/setup-skills.js.map +0 -1
  265. package/dist/devops/commands-upstream/status.d.ts +0 -2
  266. package/dist/devops/commands-upstream/status.js +0 -87
  267. package/dist/devops/commands-upstream/status.js.map +0 -1
  268. package/dist/devops/commands-upstream/update.d.ts +0 -2
  269. package/dist/devops/commands-upstream/update.js +0 -77
  270. package/dist/devops/commands-upstream/update.js.map +0 -1
  271. package/dist/devops/commands-upstream/wait-for-ready.d.ts +0 -2
  272. package/dist/devops/commands-upstream/wait-for-ready.js +0 -93
  273. package/dist/devops/commands-upstream/wait-for-ready.js.map +0 -1
  274. package/dist/devops/lib/setup-mcp.d.ts +0 -35
  275. package/dist/devops/lib/setup-mcp.js +0 -177
  276. package/dist/devops/lib/setup-mcp.js.map +0 -1
  277. package/dist/devops/utils/cloud-login.d.ts +0 -7
  278. package/dist/devops/utils/cloud-login.js +0 -56
  279. package/dist/devops/utils/cloud-login.js.map +0 -1
  280. /package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs.meta → UcoPluginTests.cs.meta} +0 -0
@@ -1,354 +1,354 @@
1
- /*
2
- ┌──────────────────────────────────────────────────────────────────┐
3
- │ Author: Ivan Murzak (https://github.com/IvanMurzak) │
4
- │ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │
5
- │ Copyright (c) 2025 Ivan Murzak │
6
- │ Licensed under the Apache License, Version 2.0. │
7
- │ See the LICENSE file in the project root for more information. │
8
- └──────────────────────────────────────────────────────────────────┘
9
- */
10
-
11
- #nullable enable
12
- using System;
13
- using System.Collections.Generic;
14
- using System.Linq;
15
- using System.Threading;
16
- using com.AtelierAI.Uco.Framework;
17
- using com.AtelierAI.Unity.Copilot.Editor.Services;
18
- using com.AtelierAI.Unity.Copilot.Editor.Utils;
19
- using Microsoft.Extensions.Logging;
20
- using R3;
21
- using UnityEngine;
22
- using UnityEngine.UIElements;
23
- using static com.AtelierAI.Uco.Framework.Common.Consts.MCP.Server;
24
- using LogLevel = com.AtelierAI.Unity.Copilot.Runtime.Utils.LogLevel;
25
-
26
- namespace com.AtelierAI.Unity.Copilot.Editor.UI
27
- {
28
- public partial class MainWindowEditor
29
- {
30
- private static readonly string[] _windowUxmlPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/UI/uxml/MainWindow.uxml");
31
- private static readonly string[] _windowUssPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/UI/uss/MainWindow.uss");
32
-
33
- private static readonly string[] _discordIconPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/Gizmos/discord_icon.png");
34
- private static readonly string[] _githubIconPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/Gizmos/github_icon.png");
35
- private static readonly string[] _starIconPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/Gizmos/star_icon.png");
36
-
37
- public const string USS_Connected = "status-indicator-circle-online";
38
- public const string USS_Connecting = "status-indicator-circle-connecting";
39
- public const string USS_Disconnected = "status-indicator-circle-disconnected";
40
- public const string USS_External = "status-indicator-circle-external";
41
-
42
- private static readonly string[] AllStatusClasses =
43
- {
44
- USS_Connected,
45
- USS_Connecting,
46
- USS_Disconnected,
47
- USS_External
48
- };
49
-
50
- private const string ServerButtonText_Connect = "Connect";
51
- private const string ServerButtonText_Disconnect = "Disconnect";
52
- private const string ServerButtonText_Stop = "Stop";
53
-
54
- private const string URL_GitHub = "https://github.com/IvanMurzak/Unity-MCP";
55
- private const string URL_GitHubIssues = "https://github.com/IvanMurzak/uco-plugin/issues";
56
- private const string URL_Discord = "https://discord.gg/cfbdMZX99G";
57
-
58
- // ── Shared tooltip building blocks ──────────────────────────────────────────
59
- //
60
- // These blocks are embedded verbatim inside the per-element tooltips below so
61
- // that each tooltip is self-contained yet the authoritative text lives in one place.
62
-
63
- private const string Tooltip_AuthorizationTokenConcept =
64
- "The authorization token is a shared secret key. When required, every AI agent " +
65
- "must include this token in its server configuration. The server rejects any " +
66
- "connection that does not supply the correct token.\n\n" +
67
- "Treat this token like a password — do not share it publicly or commit it to version control.";
68
-
69
- // ── Per-element tooltips ─────────────────────────────────────────────────────
70
-
71
- private const string Tooltip_LabelAuthorizationToken =
72
- "Controls whether the server requires a secret token to accept connections " +
73
- "from AI agents.\n\n" +
74
- Tooltip_AuthorizationTokenConcept;
75
-
76
- private const string Tooltip_ToggleAuthNone =
77
- "Local deployment — no authorization token required.\n\n" +
78
- "The server accepts any connection without checking a token. This is safe when " +
79
- "both Unity and the AI agent run on the same machine and the server port is not " +
80
- "reachable from the network.\n\n" +
81
- "Use this when:\n" +
82
- " • Unity, the server, and the AI agent are all on the same computer.\n" +
83
- " • No other machines need to reach the server.\n\n" +
84
- "⚠ Do not use this if the server port is exposed to other machines or the internet.\n\n" +
85
- "About authorization tokens:\n" +
86
- Tooltip_AuthorizationTokenConcept;
87
-
88
- private const string Tooltip_ToggleAuthRequired =
89
- "Remote deployment — authorization token required.\n\n" +
90
- "Every AI agent must supply the correct token in its server configuration. " +
91
- "The server will reject any connection that does not include a valid token.\n\n" +
92
- "Use this when:\n" +
93
- " • The server runs on a different machine from the AI agent.\n" +
94
- " • The server endpoint is reachable over a network.\n\n" +
95
- "After enabling, generate a secure token with the 'New' button, then copy it into " +
96
- "your AI agent's server configuration.\n\n" +
97
- "About authorization tokens:\n" +
98
- Tooltip_AuthorizationTokenConcept;
99
-
100
- private const string Tooltip_ToolsCountLabel =
101
- "A Tool is an executable function the AI agent can invoke to perform an action — " +
102
- "creating GameObjects, modifying assets, running scripts, reading scene data, and more. " +
103
- "Tools are the primary instrument through which the AI interacts with your Unity project.\n\n" +
104
- "Every active tool contributes tokens to the AI's context window. A smaller context means " +
105
- "the AI has more room to reason, producing better and more accurate results. " +
106
- "Disable tools you don't use to keep context consumption low.";
107
-
108
- private const string Tooltip_PromptsCountLabel =
109
- "A Prompt is a slash-command the user can invoke directly from the AI client " +
110
- "(e.g. /setup-basic-scene). Each prompt can accept arguments, and when triggered it " +
111
- "injects a pre-written instruction into the AI context, guiding the AI on what to do next.\n\n" +
112
- "Prompts do not passively consume context tokens — they only use context at the moment " +
113
- "a user explicitly invokes them.";
114
-
115
- private const string Tooltip_ResourcesCountLabel =
116
- "A Resource is a named, read-only data provider the AI agent can query to " +
117
- "understand your Unity project. Resources expose structured information such as scene " +
118
- "hierarchy, asset metadata, and project settings without performing any actions or " +
119
- "modifications.\n\n" +
120
- "Resources are fetched on-demand when the AI needs specific project information. " +
121
- "Unlike tools, they never modify any state.";
122
-
123
- private const string Tooltip_UnityTimelineLabel =
124
- "Unity Editor connection status. This indicates whether the Unity Editor is connected " +
125
- "to the server.\n\n" +
126
- "Unity must stay connected for any AI interaction to work. When connected, the AI agent " +
127
- "can invoke tools, read resources, and execute operations inside your Unity project.\n\n" +
128
- "If Unity is disconnected, no AI client will be able to reach the Editor — tools will " +
129
- "fail and the AI agent will have no way to interact with your project.\n\n" +
130
- "Use the Connect / Disconnect button to control the connection manually.";
131
-
132
- private const string Tooltip_McpServerTimelineLabel =
133
- "The server is the gateway between AI and Unity. Every AI operation that interacts " +
134
- "with Unity — tools, prompts, resources, and skills — goes through this server.\n\n" +
135
- "It translates AI requests into Unity API calls, enabling the AI agent to create " +
136
- "GameObjects, modify assets, run scripts, read scene data, execute tests, and more.\n\n" +
137
- "The server runs as a local process managed by the plugin. It starts automatically " +
138
- "when Unity opens and can be controlled manually with the Start / Stop button.\n\n" +
139
- "Without a running server, no AI client can interact with your Unity project.";
140
-
141
- private const string Tooltip_AiAgentTimelineLabel =
142
- "The AI agent connection indicator shows whether an external AI client (Claude, Cursor, " +
143
- "Copilot, etc.) is currently connected to the server.\n\n" +
144
- "It is completely normal for the AI agent to appear disconnected:\n" +
145
- " • The AI agent connects only when it needs to invoke a tool " +
146
- "or read a resource, then may drop the session.\n\n" +
147
- "The AI agent will always reconnect automatically whenever it needs to perform an " +
148
- "action in Unity — no manual intervention is required.\n\n" +
149
- "If you use AI Skills (slash-commands like /setup-basic-scene), the AI agent connection " +
150
- "is not needed at all — skills are injected directly into the AI context without an " +
151
- "active server session.\n\n" +
152
- "Important: Unity itself should always remain connected to the server (the top " +
153
- "'Unity' indicator). The AI agent indicator is informational only.";
154
-
155
- private const string Tooltip_BtnGenerateToken =
156
- "Generate a new cryptographically secure random token.\n\n" +
157
- "Uses a cryptographic RNG to produce 32 bytes (256 bits) of randomness encoded as " +
158
- "URL-safe Base64 — suitable for production-level authentication.\n\n" +
159
- "Steps after generating:\n" +
160
- " 1. The new token is saved automatically to your project configuration.\n" +
161
- " 2. The server is restarted to apply the new token.\n" +
162
- " 3. Copy the token from the input field next to this button.\n" +
163
- " 4. Open your AI agent's server configuration and paste the token into the " +
164
- "authorization field.\n\n" +
165
- "⚠ Generating a new token immediately invalidates the previous one. Every AI agent " +
166
- "must be updated with the new token before it can connect again.";
167
-
168
- private VisualElement? _aiAgentLabelsContainer;
169
- private VisualElement? _aiAgentStatusCircle;
170
-
171
- private long _mcpServerDataVersion;
172
- private long _aiAgentDataVersion;
173
-
174
- protected override void OnGUICreated(VisualElement root)
175
- {
176
- _disposables.Clear();
177
-
178
- SetupSettingsSection(root);
179
- SetupConnectionSection(root);
180
- SetupMcpServerSection(root);
181
- SetupAiAgentSection(root);
182
- SetupDebugButtons(root);
183
- EnableSmoothFoldoutTransitions(root);
184
- }
185
-
186
- #region Status Indicator Helpers
187
-
188
- private static void SetStatusIndicator(VisualElement element, string statusClass)
189
- {
190
- foreach (var cls in AllStatusClasses)
191
- element.RemoveFromClassList(cls);
192
- element.AddToClassList(statusClass);
193
- }
194
-
195
- internal static string GetConnectionStatusClass(ConnectionState state, bool keepConnected) => state switch
196
- {
197
- ConnectionState.Connected when keepConnected => USS_Connected,
198
- _ when keepConnected => USS_Connecting,
199
- _ => USS_Disconnected
200
- };
201
-
202
- internal static string GetConnectionStatusText(ConnectionState state, bool keepConnected) => state switch
203
- {
204
- ConnectionState.Connected when keepConnected => "Connected",
205
- _ when keepConnected => "Connecting...",
206
- _ => "Disconnected"
207
- };
208
-
209
- internal static string GetButtonText(ConnectionState state, bool keepConnected) => state switch
210
- {
211
- ConnectionState.Connected when keepConnected => ServerButtonText_Disconnect,
212
- _ when keepConnected => ServerButtonText_Stop,
213
- _ => ServerButtonText_Connect
214
- };
215
-
216
- private void SetAiAgentStatus(bool isConnected, IEnumerable<string>? labels = null)
217
- {
218
- Interlocked.Increment(ref _aiAgentDataVersion);
219
-
220
- if (_aiAgentStatusCircle == null)
221
- {
222
- Logger.LogError("{field} is not initialized, cannot update AI agent status", nameof(_aiAgentStatusCircle));
223
- return;
224
- }
225
- if (_aiAgentLabelsContainer == null)
226
- {
227
- Logger.LogError("{field} is not initialized, cannot update AI agent status", nameof(_aiAgentLabelsContainer));
228
- return;
229
- }
230
-
231
- SetStatusIndicator(_aiAgentStatusCircle, isConnected ? USS_Connected : USS_Disconnected);
232
- _aiAgentStatusCircle.tooltip = Tooltip_AiAgentTimelineLabel;
233
-
234
- _aiAgentLabelsContainer.tooltip = Tooltip_AiAgentTimelineLabel;
235
- _aiAgentLabelsContainer.Clear();
236
- var labelList = labels?.ToList();
237
- if (labelList == null || labelList.Count == 0)
238
- {
239
- var lbl = new Label("AI agent");
240
- lbl.AddToClassList("timeline-label");
241
- lbl.tooltip = Tooltip_AiAgentTimelineLabel;
242
- _aiAgentLabelsContainer.Add(lbl);
243
- }
244
- else
245
- {
246
- foreach (var text in labelList)
247
- {
248
- var lbl = new Label(text);
249
- lbl.AddToClassList("timeline-label");
250
- lbl.tooltip = Tooltip_AiAgentTimelineLabel;
251
- _aiAgentLabelsContainer.Add(lbl);
252
- }
253
- }
254
- }
255
-
256
- #endregion
257
-
258
- #region Header
259
-
260
- private void SetupSettingsSection(VisualElement root)
261
- {
262
- // Populate in code rather than via UXML type="..." so the UXML importer
263
- // doesn't need to resolve com.AtelierAI.Unity.Copilot.Runtime at asset-import
264
- // time (the Runtime asmdef is gated by UNITY_COPILOT_READY, which is set later
265
- // by the NuGet resolver — resolving it during UXML import produces a
266
- // TypeLoadException on the very first package import).
267
- var dropdownLogLevel = root.Q<DropdownField>("dropdownLogLevel");
268
- dropdownLogLevel.choices = Enum.GetNames(typeof(LogLevel)).ToList();
269
- dropdownLogLevel.value = UnityCopilotPluginEditor.LogLevel.ToString();
270
- dropdownLogLevel.tooltip = "The minimum level of messages to log. Debug includes all messages, while Critical includes only the most severe.";
271
- dropdownLogLevel.RegisterValueChangedCallback(evt =>
272
- {
273
- UnityCopilotPluginEditor.LogLevel = Enum.TryParse<LogLevel>(evt.newValue, out var parsed)
274
- ? parsed
275
- : LogLevel.Warning;
276
- SaveChanges($"[Unity Copilot] LogLevel Changed: {evt.newValue}");
277
- });
278
-
279
- var inputTimeoutMs = root.Q<IntegerField>("inputTimeoutMs");
280
- inputTimeoutMs.value = UnityCopilotPluginEditor.TimeoutMs;
281
- inputTimeoutMs.tooltip = $"Timeout for tool execution in milliseconds.\n\nMost tools only need a few seconds.\n\nSet this higher than your longest test execution time.\n\nImportant: Also update the '{Args.PluginTimeout}' argument in your AI agent configuration to match this value so your AI agent doesn't timeout before the tool completes.";
282
- inputTimeoutMs.RegisterCallback<FocusOutEvent>(evt =>
283
- {
284
- var newValue = Mathf.Max(1000, inputTimeoutMs.value);
285
- if (newValue == UnityCopilotPluginEditor.TimeoutMs)
286
- return;
287
-
288
- if (newValue != inputTimeoutMs.value)
289
- inputTimeoutMs.SetValueWithoutNotify(newValue);
290
-
291
- UnityCopilotPluginEditor.TimeoutMs = newValue;
292
-
293
- SaveChanges($"[Unity Copilot] Timeout Changed: {newValue} ms");
294
- UnityBuildAndConnect();
295
- });
296
-
297
- root.Q<TextField>("currentVersion").value = UnityCopilotPlugin.Version;
298
- }
299
-
300
- #endregion
301
-
302
- #region Shared Helpers
303
-
304
- /// <summary>
305
- /// Subscribes to the combined connection state (ConnectionState + KeepConnected) with
306
- /// throttling and synchronization context marshaling.
307
- /// </summary>
308
- private void SubscribeToConnectionState(Action<ConnectionState, bool> onStateChanged)
309
- {
310
- UnityCopilotPluginEditor.PluginProperty
311
- .WhereNotNull()
312
- .Subscribe(plugin =>
313
- {
314
- Observable.CombineLatest(
315
- UnityCopilotPluginEditor.ConnectionState, plugin.KeepConnected,
316
- (state, keepConnected) => (state, keepConnected))
317
- .ThrottleLast(TimeSpan.FromMilliseconds(10))
318
- .ObserveOnCurrentSynchronizationContext()
319
- .SubscribeOnCurrentSynchronizationContext()
320
- .Subscribe(tuple =>
321
- {
322
- var (state, keepConnected) = tuple;
323
- onStateChanged(state, keepConnected);
324
- })
325
- .AddTo(_disposables);
326
- }).AddTo(_disposables);
327
- }
328
-
329
- #endregion
330
-
331
- // Relocated from MainWindowEditor.AiAgents.cs (retained after the AI Agent configurator
332
- // removal — these are generic token-field / server-restart helpers, not agent-specific).
333
- private static void SetTokenFieldsVisible(TextField tokenField, VisualElement actionsRow, bool visible)
334
- {
335
- tokenField.style.display = visible ? DisplayStyle.Flex : DisplayStyle.None;
336
- actionsRow.style.display = visible ? DisplayStyle.Flex : DisplayStyle.None;
337
- }
338
-
339
- private void RestartServerIfWasRunning(bool wasRunning)
340
- {
341
- if (!wasRunning)
342
- return;
343
-
344
- CopilotServerManager.StopServer();
345
-
346
- CopilotServerManager.ServerStatus
347
- .Where(status => status == CopilotServerStatus.Stopped)
348
- .Take(1)
349
- .ObserveOnCurrentSynchronizationContext()
350
- .Subscribe(_ => CopilotServerManager.StartServer())
351
- .AddTo(_disposables);
352
- }
353
- }
354
- }
1
+ /*
2
+ ┌──────────────────────────────────────────────────────────────────┐
3
+ │ Author: Ivan Murzak (https://github.com/IvanMurzak) │
4
+ │ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │
5
+ │ Copyright (c) 2025 Ivan Murzak │
6
+ │ Licensed under the Apache License, Version 2.0. │
7
+ │ See the LICENSE file in the project root for more information. │
8
+ └──────────────────────────────────────────────────────────────────┘
9
+ */
10
+
11
+ #nullable enable
12
+ using System;
13
+ using System.Collections.Generic;
14
+ using System.Linq;
15
+ using System.Threading;
16
+ using com.AtelierAI.Uco.Framework;
17
+ using com.AtelierAI.Unity.Copilot.Editor.Services;
18
+ using com.AtelierAI.Unity.Copilot.Editor.Utils;
19
+ using Microsoft.Extensions.Logging;
20
+ using R3;
21
+ using UnityEngine;
22
+ using UnityEngine.UIElements;
23
+ using static com.AtelierAI.Uco.Framework.Common.Consts.Uco.Server;
24
+ using LogLevel = com.AtelierAI.Unity.Copilot.Runtime.Utils.LogLevel;
25
+
26
+ namespace com.AtelierAI.Unity.Copilot.Editor.UI
27
+ {
28
+ public partial class MainWindowEditor
29
+ {
30
+ private static readonly string[] _windowUxmlPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/UI/uxml/MainWindow.uxml");
31
+ private static readonly string[] _windowUssPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/UI/uss/MainWindow.uss");
32
+
33
+ private static readonly string[] _discordIconPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/Gizmos/discord_icon.png");
34
+ private static readonly string[] _githubIconPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/Gizmos/github_icon.png");
35
+ private static readonly string[] _starIconPaths = EditorAssetLoader.GetEditorAssetPaths("Editor/Gizmos/star_icon.png");
36
+
37
+ public const string USS_Connected = "status-indicator-circle-online";
38
+ public const string USS_Connecting = "status-indicator-circle-connecting";
39
+ public const string USS_Disconnected = "status-indicator-circle-disconnected";
40
+ public const string USS_External = "status-indicator-circle-external";
41
+
42
+ private static readonly string[] AllStatusClasses =
43
+ {
44
+ USS_Connected,
45
+ USS_Connecting,
46
+ USS_Disconnected,
47
+ USS_External
48
+ };
49
+
50
+ private const string ServerButtonText_Connect = "Connect";
51
+ private const string ServerButtonText_Disconnect = "Disconnect";
52
+ private const string ServerButtonText_Stop = "Stop";
53
+
54
+ private const string URL_GitHub = "https://github.com/IvanMurzak/Unity-MCP";
55
+ private const string URL_GitHubIssues = "https://github.com/IvanMurzak/uco-plugin/issues";
56
+ private const string URL_Discord = "https://discord.gg/cfbdMZX99G";
57
+
58
+ // ── Shared tooltip building blocks ──────────────────────────────────────────
59
+ //
60
+ // These blocks are embedded verbatim inside the per-element tooltips below so
61
+ // that each tooltip is self-contained yet the authoritative text lives in one place.
62
+
63
+ private const string Tooltip_AuthorizationTokenConcept =
64
+ "The authorization token is a shared secret key. When required, every AI agent " +
65
+ "must include this token in its server configuration. The server rejects any " +
66
+ "connection that does not supply the correct token.\n\n" +
67
+ "Treat this token like a password — do not share it publicly or commit it to version control.";
68
+
69
+ // ── Per-element tooltips ─────────────────────────────────────────────────────
70
+
71
+ private const string Tooltip_LabelAuthorizationToken =
72
+ "Controls whether the server requires a secret token to accept connections " +
73
+ "from AI agents.\n\n" +
74
+ Tooltip_AuthorizationTokenConcept;
75
+
76
+ private const string Tooltip_ToggleAuthNone =
77
+ "Local deployment — no authorization token required.\n\n" +
78
+ "The server accepts any connection without checking a token. This is safe when " +
79
+ "both Unity and the AI agent run on the same machine and the server port is not " +
80
+ "reachable from the network.\n\n" +
81
+ "Use this when:\n" +
82
+ " • Unity, the server, and the AI agent are all on the same computer.\n" +
83
+ " • No other machines need to reach the server.\n\n" +
84
+ "⚠ Do not use this if the server port is exposed to other machines or the internet.\n\n" +
85
+ "About authorization tokens:\n" +
86
+ Tooltip_AuthorizationTokenConcept;
87
+
88
+ private const string Tooltip_ToggleAuthRequired =
89
+ "Remote deployment — authorization token required.\n\n" +
90
+ "Every AI agent must supply the correct token in its server configuration. " +
91
+ "The server will reject any connection that does not include a valid token.\n\n" +
92
+ "Use this when:\n" +
93
+ " • The server runs on a different machine from the AI agent.\n" +
94
+ " • The server endpoint is reachable over a network.\n\n" +
95
+ "After enabling, generate a secure token with the 'New' button, then copy it into " +
96
+ "your AI agent's server configuration.\n\n" +
97
+ "About authorization tokens:\n" +
98
+ Tooltip_AuthorizationTokenConcept;
99
+
100
+ private const string Tooltip_ToolsCountLabel =
101
+ "A Tool is an executable function the AI agent can invoke to perform an action — " +
102
+ "creating GameObjects, modifying assets, running scripts, reading scene data, and more. " +
103
+ "Tools are the primary instrument through which the AI interacts with your Unity project.\n\n" +
104
+ "Every active tool contributes tokens to the AI's context window. A smaller context means " +
105
+ "the AI has more room to reason, producing better and more accurate results. " +
106
+ "Disable tools you don't use to keep context consumption low.";
107
+
108
+ private const string Tooltip_PromptsCountLabel =
109
+ "A Prompt is a slash-command the user can invoke directly from the AI client " +
110
+ "(e.g. /setup-basic-scene). Each prompt can accept arguments, and when triggered it " +
111
+ "injects a pre-written instruction into the AI context, guiding the AI on what to do next.\n\n" +
112
+ "Prompts do not passively consume context tokens — they only use context at the moment " +
113
+ "a user explicitly invokes them.";
114
+
115
+ private const string Tooltip_ResourcesCountLabel =
116
+ "A Resource is a named, read-only data provider the AI agent can query to " +
117
+ "understand your Unity project. Resources expose structured information such as scene " +
118
+ "hierarchy, asset metadata, and project settings without performing any actions or " +
119
+ "modifications.\n\n" +
120
+ "Resources are fetched on-demand when the AI needs specific project information. " +
121
+ "Unlike tools, they never modify any state.";
122
+
123
+ private const string Tooltip_UnityTimelineLabel =
124
+ "Unity Editor connection status. This indicates whether the Unity Editor is connected " +
125
+ "to the server.\n\n" +
126
+ "Unity must stay connected for any AI interaction to work. When connected, the AI agent " +
127
+ "can invoke tools, read resources, and execute operations inside your Unity project.\n\n" +
128
+ "If Unity is disconnected, no AI client will be able to reach the Editor — tools will " +
129
+ "fail and the AI agent will have no way to interact with your project.\n\n" +
130
+ "Use the Connect / Disconnect button to control the connection manually.";
131
+
132
+ private const string Tooltip_ServerTimelineLabel =
133
+ "The server is the gateway between AI and Unity. Every AI operation that interacts " +
134
+ "with Unity — tools, prompts, resources, and skills — goes through this server.\n\n" +
135
+ "It translates AI requests into Unity API calls, enabling the AI agent to create " +
136
+ "GameObjects, modify assets, run scripts, read scene data, execute tests, and more.\n\n" +
137
+ "The server runs as a local process managed by the plugin. It starts automatically " +
138
+ "when Unity opens and can be controlled manually with the Start / Stop button.\n\n" +
139
+ "Without a running server, no AI client can interact with your Unity project.";
140
+
141
+ private const string Tooltip_AiAgentTimelineLabel =
142
+ "The AI agent connection indicator shows whether an external AI client (Claude, Cursor, " +
143
+ "Copilot, etc.) is currently connected to the server.\n\n" +
144
+ "It is completely normal for the AI agent to appear disconnected:\n" +
145
+ " • The AI agent connects only when it needs to invoke a tool " +
146
+ "or read a resource, then may drop the session.\n\n" +
147
+ "The AI agent will always reconnect automatically whenever it needs to perform an " +
148
+ "action in Unity — no manual intervention is required.\n\n" +
149
+ "If you use AI Skills (slash-commands like /setup-basic-scene), the AI agent connection " +
150
+ "is not needed at all — skills are injected directly into the AI context without an " +
151
+ "active server session.\n\n" +
152
+ "Important: Unity itself should always remain connected to the server (the top " +
153
+ "'Unity' indicator). The AI agent indicator is informational only.";
154
+
155
+ private const string Tooltip_BtnGenerateToken =
156
+ "Generate a new cryptographically secure random token.\n\n" +
157
+ "Uses a cryptographic RNG to produce 32 bytes (256 bits) of randomness encoded as " +
158
+ "URL-safe Base64 — suitable for production-level authentication.\n\n" +
159
+ "Steps after generating:\n" +
160
+ " 1. The new token is saved automatically to your project configuration.\n" +
161
+ " 2. The server is restarted to apply the new token.\n" +
162
+ " 3. Copy the token from the input field next to this button.\n" +
163
+ " 4. Open your AI agent's server configuration and paste the token into the " +
164
+ "authorization field.\n\n" +
165
+ "⚠ Generating a new token immediately invalidates the previous one. Every AI agent " +
166
+ "must be updated with the new token before it can connect again.";
167
+
168
+ private VisualElement? _aiAgentLabelsContainer;
169
+ private VisualElement? _aiAgentStatusCircle;
170
+
171
+ private long _serverDataVersion;
172
+ private long _aiAgentDataVersion;
173
+
174
+ protected override void OnGUICreated(VisualElement root)
175
+ {
176
+ _disposables.Clear();
177
+
178
+ SetupSettingsSection(root);
179
+ SetupConnectionSection(root);
180
+ SetupServerSection(root);
181
+ SetupAiAgentSection(root);
182
+ SetupDebugButtons(root);
183
+ EnableSmoothFoldoutTransitions(root);
184
+ }
185
+
186
+ #region Status Indicator Helpers
187
+
188
+ private static void SetStatusIndicator(VisualElement element, string statusClass)
189
+ {
190
+ foreach (var cls in AllStatusClasses)
191
+ element.RemoveFromClassList(cls);
192
+ element.AddToClassList(statusClass);
193
+ }
194
+
195
+ internal static string GetConnectionStatusClass(ConnectionState state, bool keepConnected) => state switch
196
+ {
197
+ ConnectionState.Connected when keepConnected => USS_Connected,
198
+ _ when keepConnected => USS_Connecting,
199
+ _ => USS_Disconnected
200
+ };
201
+
202
+ internal static string GetConnectionStatusText(ConnectionState state, bool keepConnected) => state switch
203
+ {
204
+ ConnectionState.Connected when keepConnected => "Connected",
205
+ _ when keepConnected => "Connecting...",
206
+ _ => "Disconnected"
207
+ };
208
+
209
+ internal static string GetButtonText(ConnectionState state, bool keepConnected) => state switch
210
+ {
211
+ ConnectionState.Connected when keepConnected => ServerButtonText_Disconnect,
212
+ _ when keepConnected => ServerButtonText_Stop,
213
+ _ => ServerButtonText_Connect
214
+ };
215
+
216
+ private void SetAiAgentStatus(bool isConnected, IEnumerable<string>? labels = null)
217
+ {
218
+ Interlocked.Increment(ref _aiAgentDataVersion);
219
+
220
+ if (_aiAgentStatusCircle == null)
221
+ {
222
+ Logger.LogError("{field} is not initialized, cannot update AI agent status", nameof(_aiAgentStatusCircle));
223
+ return;
224
+ }
225
+ if (_aiAgentLabelsContainer == null)
226
+ {
227
+ Logger.LogError("{field} is not initialized, cannot update AI agent status", nameof(_aiAgentLabelsContainer));
228
+ return;
229
+ }
230
+
231
+ SetStatusIndicator(_aiAgentStatusCircle, isConnected ? USS_Connected : USS_Disconnected);
232
+ _aiAgentStatusCircle.tooltip = Tooltip_AiAgentTimelineLabel;
233
+
234
+ _aiAgentLabelsContainer.tooltip = Tooltip_AiAgentTimelineLabel;
235
+ _aiAgentLabelsContainer.Clear();
236
+ var labelList = labels?.ToList();
237
+ if (labelList == null || labelList.Count == 0)
238
+ {
239
+ var lbl = new Label("AI agent");
240
+ lbl.AddToClassList("timeline-label");
241
+ lbl.tooltip = Tooltip_AiAgentTimelineLabel;
242
+ _aiAgentLabelsContainer.Add(lbl);
243
+ }
244
+ else
245
+ {
246
+ foreach (var text in labelList)
247
+ {
248
+ var lbl = new Label(text);
249
+ lbl.AddToClassList("timeline-label");
250
+ lbl.tooltip = Tooltip_AiAgentTimelineLabel;
251
+ _aiAgentLabelsContainer.Add(lbl);
252
+ }
253
+ }
254
+ }
255
+
256
+ #endregion
257
+
258
+ #region Header
259
+
260
+ private void SetupSettingsSection(VisualElement root)
261
+ {
262
+ // Populate in code rather than via UXML type="..." so the UXML importer
263
+ // doesn't need to resolve com.AtelierAI.Unity.Copilot.Runtime at asset-import
264
+ // time (the Runtime asmdef is gated by UNITY_COPILOT_READY, which is set later
265
+ // by the NuGet resolver — resolving it during UXML import produces a
266
+ // TypeLoadException on the very first package import).
267
+ var dropdownLogLevel = root.Q<DropdownField>("dropdownLogLevel");
268
+ dropdownLogLevel.choices = Enum.GetNames(typeof(LogLevel)).ToList();
269
+ dropdownLogLevel.value = UnityCopilotPluginEditor.LogLevel.ToString();
270
+ dropdownLogLevel.tooltip = "The minimum level of messages to log. Debug includes all messages, while Critical includes only the most severe.";
271
+ dropdownLogLevel.RegisterValueChangedCallback(evt =>
272
+ {
273
+ UnityCopilotPluginEditor.LogLevel = Enum.TryParse<LogLevel>(evt.newValue, out var parsed)
274
+ ? parsed
275
+ : LogLevel.Warning;
276
+ SaveChanges($"[Unity Copilot] LogLevel Changed: {evt.newValue}");
277
+ });
278
+
279
+ var inputTimeoutMs = root.Q<IntegerField>("inputTimeoutMs");
280
+ inputTimeoutMs.value = UnityCopilotPluginEditor.TimeoutMs;
281
+ inputTimeoutMs.tooltip = $"Timeout for tool execution in milliseconds.\n\nMost tools only need a few seconds.\n\nSet this higher than your longest test execution time.\n\nImportant: Also update the '{Args.PluginTimeout}' argument in your AI agent configuration to match this value so your AI agent doesn't timeout before the tool completes.";
282
+ inputTimeoutMs.RegisterCallback<FocusOutEvent>(evt =>
283
+ {
284
+ var newValue = Mathf.Max(1000, inputTimeoutMs.value);
285
+ if (newValue == UnityCopilotPluginEditor.TimeoutMs)
286
+ return;
287
+
288
+ if (newValue != inputTimeoutMs.value)
289
+ inputTimeoutMs.SetValueWithoutNotify(newValue);
290
+
291
+ UnityCopilotPluginEditor.TimeoutMs = newValue;
292
+
293
+ SaveChanges($"[Unity Copilot] Timeout Changed: {newValue} ms");
294
+ UnityBuildAndConnect();
295
+ });
296
+
297
+ root.Q<TextField>("currentVersion").value = UnityCopilotPlugin.Version;
298
+ }
299
+
300
+ #endregion
301
+
302
+ #region Shared Helpers
303
+
304
+ /// <summary>
305
+ /// Subscribes to the combined connection state (ConnectionState + KeepConnected) with
306
+ /// throttling and synchronization context marshaling.
307
+ /// </summary>
308
+ private void SubscribeToConnectionState(Action<ConnectionState, bool> onStateChanged)
309
+ {
310
+ UnityCopilotPluginEditor.PluginProperty
311
+ .WhereNotNull()
312
+ .Subscribe(plugin =>
313
+ {
314
+ Observable.CombineLatest(
315
+ UnityCopilotPluginEditor.ConnectionState, plugin.KeepConnected,
316
+ (state, keepConnected) => (state, keepConnected))
317
+ .ThrottleLast(TimeSpan.FromMilliseconds(10))
318
+ .ObserveOnCurrentSynchronizationContext()
319
+ .SubscribeOnCurrentSynchronizationContext()
320
+ .Subscribe(tuple =>
321
+ {
322
+ var (state, keepConnected) = tuple;
323
+ onStateChanged(state, keepConnected);
324
+ })
325
+ .AddTo(_disposables);
326
+ }).AddTo(_disposables);
327
+ }
328
+
329
+ #endregion
330
+
331
+ // Relocated from MainWindowEditor.AiAgents.cs (retained after the AI Agent configurator
332
+ // removal — these are generic token-field / server-restart helpers, not agent-specific).
333
+ private static void SetTokenFieldsVisible(TextField tokenField, VisualElement actionsRow, bool visible)
334
+ {
335
+ tokenField.style.display = visible ? DisplayStyle.Flex : DisplayStyle.None;
336
+ actionsRow.style.display = visible ? DisplayStyle.Flex : DisplayStyle.None;
337
+ }
338
+
339
+ private void RestartServerIfWasRunning(bool wasRunning)
340
+ {
341
+ if (!wasRunning)
342
+ return;
343
+
344
+ CopilotServerManager.StopServer();
345
+
346
+ CopilotServerManager.ServerStatus
347
+ .Where(status => status == CopilotServerStatus.Stopped)
348
+ .Take(1)
349
+ .ObserveOnCurrentSynchronizationContext()
350
+ .Subscribe(_ => CopilotServerManager.StartServer())
351
+ .AddTo(_disposables);
352
+ }
353
+ }
354
+ }