@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,119 +1,119 @@
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 com.AtelierAI.Unity.Copilot.Editor.Branding;
13
- using UnityEditor;
14
- using UnityEngine;
15
-
16
- namespace com.AtelierAI.Unity.Copilot.Editor.Utils
17
- {
18
- // Phase C rebrand carries forward existing user state across the
19
- // "com.ivanmurzak.unity.mcp" → "com.atelierai.unity.copilot" key namespace shift.
20
- // Runs once per project (guarded by MigrationDoneKey) on domain reload and copies
21
- // old EditorPrefs keys into the new namespace. Old keys are left in place — they're
22
- // harmless and lets users downgrade if the rebrand is reverted. A future major
23
- // version can delete this class and the old keys together.
24
- [InitializeOnLoad]
25
- internal static class PrefsKeyMigration
26
- {
27
- // Bumped when migration logic changes. Stored under the NEW prefix so the
28
- // flag survives the rename and only triggers once per (project, version).
29
- private const int MigrationVersion = 1;
30
- private static readonly string MigrationDoneKey =
31
- $"{ProductInfo.PackageId}.{Fnv1a32(Application.dataPath):X8}.PrefsKeyMigration.Version";
32
-
33
- static PrefsKeyMigration()
34
- {
35
- try
36
- {
37
- if (EditorPrefs.GetInt(MigrationDoneKey, 0) >= MigrationVersion)
38
- return;
39
-
40
- MigrateToolGroupsEnabled();
41
- MigrateUpdateCheckerKeys();
42
- MigrateServerProcessId();
43
-
44
- EditorPrefs.SetInt(MigrationDoneKey, MigrationVersion);
45
- }
46
- catch (System.Exception ex)
47
- {
48
- // Migration failure must never break Editor startup. Worst case the user
49
- // re-sees the update popup once or re-configures tool groups.
50
- Debug.LogWarning($"{ProductInfo.LogPrefix} PrefsKeyMigration skipped: {ex.Message}");
51
- }
52
- }
53
-
54
- // ToolGroupRegistry persists enabled tool-group names under a flat key — no
55
- // per-project hash because the registry is project-local already (Unity creates
56
- // a fresh EditorPrefs scope per install, and the value is just a CSV).
57
- private static void MigrateToolGroupsEnabled()
58
- {
59
- const string oldKey = "UnityMcp.ToolGroups.Enabled";
60
- string newKey = $"{ProductInfo.EditorPrefsPrefix}.ToolGroups.Enabled";
61
- if (oldKey == newKey) return;
62
- if (!EditorPrefs.HasKey(oldKey)) return;
63
- if (EditorPrefs.HasKey(newKey)) return; // user already configured under new name
64
- EditorPrefs.SetString(newKey, EditorPrefs.GetString(oldKey));
65
- }
66
-
67
- // UpdateChecker namespaces keys by (packageId, FNV-1a(Application.dataPath)) so a
68
- // user with multiple Unity projects keeps independent "Do not show again" state.
69
- // After rebrand the packageId segment changes, so for THIS project's hash we copy
70
- // each of the three sub-keys forward.
71
- private static void MigrateUpdateCheckerKeys()
72
- {
73
- string hash = $"{Fnv1a32(Application.dataPath):X8}";
74
- string oldPrefix = $"{ProductInfo.LegacyPackageId}.{hash}.UpdateChecker.";
75
- string newPrefix = $"{ProductInfo.PackageId}.{hash}.UpdateChecker.";
76
- if (oldPrefix == newPrefix) return;
77
-
78
- CopyStringIfMissing(oldPrefix + "DoNotShowAgain", newPrefix + "DoNotShowAgain");
79
- CopyStringIfMissing(oldPrefix + "NextCheckTime", newPrefix + "NextCheckTime");
80
- CopyStringIfMissing(oldPrefix + "SkippedVersion", newPrefix + "SkippedVersion");
81
- }
82
-
83
- // ServerManager pid is transient (server respawns) but copying avoids a stale
84
- // "is the server already running?" probe on the first reload after rebrand.
85
- private static void MigrateServerProcessId()
86
- {
87
- const string oldKey = "McpServerManager_ProcessId";
88
- const string newKey = "CopilotServerManager_ProcessId";
89
- if (!EditorPrefs.HasKey(oldKey)) return;
90
- if (EditorPrefs.HasKey(newKey)) return;
91
- EditorPrefs.SetInt(newKey, EditorPrefs.GetInt(oldKey));
92
- }
93
-
94
- private static void CopyStringIfMissing(string oldKey, string newKey)
95
- {
96
- if (!EditorPrefs.HasKey(oldKey)) return;
97
- if (EditorPrefs.HasKey(newKey)) return;
98
- EditorPrefs.SetString(newKey, EditorPrefs.GetString(oldKey));
99
- }
100
-
101
- // Duplicated from UpdateChecker.cs — extracting to a shared util is a larger
102
- // refactor than this phase warrants. Same FNV-1a (offsetBasis 2166136261,
103
- // prime 16777619), same per-UTF-16-codepoint two-byte loop.
104
- private static uint Fnv1a32(string input)
105
- {
106
- const uint offsetBasis = 2166136261u;
107
- const uint prime = 16777619u;
108
- var hash = offsetBasis;
109
- for (int i = 0; i < input.Length; i++)
110
- {
111
- hash ^= (byte)(input[i] & 0xFF);
112
- hash *= prime;
113
- hash ^= (byte)((input[i] >> 8) & 0xFF);
114
- hash *= prime;
115
- }
116
- return hash;
117
- }
118
- }
119
- }
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 com.AtelierAI.Unity.Copilot.Editor.Branding;
13
+ using UnityEditor;
14
+ using UnityEngine;
15
+
16
+ namespace com.AtelierAI.Unity.Copilot.Editor.Utils
17
+ {
18
+ // Phase C rebrand carries forward existing user state across the
19
+ // "com.ivanmurzak.unity.plugin" → "com.atelierai.unity.copilot" key namespace shift.
20
+ // Runs once per project (guarded by MigrationDoneKey) on domain reload and copies
21
+ // old EditorPrefs keys into the new namespace. Old keys are left in place — they're
22
+ // harmless and lets users downgrade if the rebrand is reverted. A future major
23
+ // version can delete this class and the old keys together.
24
+ [InitializeOnLoad]
25
+ internal static class PrefsKeyMigration
26
+ {
27
+ // Bumped when migration logic changes. Stored under the NEW prefix so the
28
+ // flag survives the rename and only triggers once per (project, version).
29
+ private const int MigrationVersion = 1;
30
+ private static readonly string MigrationDoneKey =
31
+ $"{ProductInfo.PackageId}.{Fnv1a32(Application.dataPath):X8}.PrefsKeyMigration.Version";
32
+
33
+ static PrefsKeyMigration()
34
+ {
35
+ try
36
+ {
37
+ if (EditorPrefs.GetInt(MigrationDoneKey, 0) >= MigrationVersion)
38
+ return;
39
+
40
+ MigrateToolGroupsEnabled();
41
+ MigrateUpdateCheckerKeys();
42
+ MigrateServerProcessId();
43
+
44
+ EditorPrefs.SetInt(MigrationDoneKey, MigrationVersion);
45
+ }
46
+ catch (System.Exception ex)
47
+ {
48
+ // Migration failure must never break Editor startup. Worst case the user
49
+ // re-sees the update popup once or re-configures tool groups.
50
+ Debug.LogWarning($"{ProductInfo.LogPrefix} PrefsKeyMigration skipped: {ex.Message}");
51
+ }
52
+ }
53
+
54
+ // ToolGroupRegistry persists enabled tool-group names under a flat key — no
55
+ // per-project hash because the registry is project-local already (Unity creates
56
+ // a fresh EditorPrefs scope per install, and the value is just a CSV).
57
+ private static void MigrateToolGroupsEnabled()
58
+ {
59
+ const string oldKey = "UnityMcp.ToolGroups.Enabled";
60
+ string newKey = $"{ProductInfo.EditorPrefsPrefix}.ToolGroups.Enabled";
61
+ if (oldKey == newKey) return;
62
+ if (!EditorPrefs.HasKey(oldKey)) return;
63
+ if (EditorPrefs.HasKey(newKey)) return; // user already configured under new name
64
+ EditorPrefs.SetString(newKey, EditorPrefs.GetString(oldKey));
65
+ }
66
+
67
+ // UpdateChecker namespaces keys by (packageId, FNV-1a(Application.dataPath)) so a
68
+ // user with multiple Unity projects keeps independent "Do not show again" state.
69
+ // After rebrand the packageId segment changes, so for THIS project's hash we copy
70
+ // each of the three sub-keys forward.
71
+ private static void MigrateUpdateCheckerKeys()
72
+ {
73
+ string hash = $"{Fnv1a32(Application.dataPath):X8}";
74
+ string oldPrefix = $"{ProductInfo.LegacyPackageId}.{hash}.UpdateChecker.";
75
+ string newPrefix = $"{ProductInfo.PackageId}.{hash}.UpdateChecker.";
76
+ if (oldPrefix == newPrefix) return;
77
+
78
+ CopyStringIfMissing(oldPrefix + "DoNotShowAgain", newPrefix + "DoNotShowAgain");
79
+ CopyStringIfMissing(oldPrefix + "NextCheckTime", newPrefix + "NextCheckTime");
80
+ CopyStringIfMissing(oldPrefix + "SkippedVersion", newPrefix + "SkippedVersion");
81
+ }
82
+
83
+ // ServerManager pid is transient (server respawns) but copying avoids a stale
84
+ // "is the server already running?" probe on the first reload after rebrand.
85
+ private static void MigrateServerProcessId()
86
+ {
87
+ const string oldKey = "McpServerManager_ProcessId";
88
+ const string newKey = "CopilotServerManager_ProcessId";
89
+ if (!EditorPrefs.HasKey(oldKey)) return;
90
+ if (EditorPrefs.HasKey(newKey)) return;
91
+ EditorPrefs.SetInt(newKey, EditorPrefs.GetInt(oldKey));
92
+ }
93
+
94
+ private static void CopyStringIfMissing(string oldKey, string newKey)
95
+ {
96
+ if (!EditorPrefs.HasKey(oldKey)) return;
97
+ if (EditorPrefs.HasKey(newKey)) return;
98
+ EditorPrefs.SetString(newKey, EditorPrefs.GetString(oldKey));
99
+ }
100
+
101
+ // Duplicated from UpdateChecker.cs — extracting to a shared util is a larger
102
+ // refactor than this phase warrants. Same FNV-1a (offsetBasis 2166136261,
103
+ // prime 16777619), same per-UTF-16-codepoint two-byte loop.
104
+ private static uint Fnv1a32(string input)
105
+ {
106
+ const uint offsetBasis = 2166136261u;
107
+ const uint prime = 16777619u;
108
+ var hash = offsetBasis;
109
+ for (int i = 0; i < input.Length; i++)
110
+ {
111
+ hash ^= (byte)(input[i] & 0xFF);
112
+ hash *= prime;
113
+ hash ^= (byte)((input[i] >> 8) & 0xFF);
114
+ hash *= prime;
115
+ }
116
+ return hash;
117
+ }
118
+ }
119
+ }
@@ -1,180 +1,180 @@
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.Net;
14
- using System.Net.Sockets;
15
-
16
- namespace com.AtelierAI.Unity.Copilot.Editor.Utils
17
- {
18
- /// <summary>
19
- /// Centralised "is the current configuration safe to start?" policy. Implements the
20
- /// fail-closed posture described on <see cref="UnityCopilotPlugin.UnityConnectionConfig.AllowLanBind"/>:
21
- /// the local MCP server only auto-starts on a non-loopback bind / over insecure remote HTTP
22
- /// when the user has explicitly opted in via the corresponding flag, AND any LAN bind
23
- /// additionally requires a token when <c>ForceTokenWhenLanBind</c> is true.
24
- ///
25
- /// The guard is purely advisory at the URL-parsing layer (no Unity API access) so it can be
26
- /// unit-tested without entering Play mode. The only Unity-side side effect lives in
27
- /// <see cref="ShouldRejectStart"/>, which reads the editor's current config.
28
- /// </summary>
29
- public static class SafeDefaultsGuard
30
- {
31
- /// <summary>
32
- /// Returns true when the given URL has a host that is NOT a loopback address.
33
- /// Loopback covers <c>localhost</c>, <c>127.0.0.0/8</c>, and <c>::1</c>.
34
- /// Wildcard binds (<c>0.0.0.0</c>, <c>::</c>, <c>*</c>, <c>+</c>) and concrete LAN IPs
35
- /// or hostnames are treated as non-loopback (and therefore "LAN bind" for the purposes
36
- /// of the guard).
37
- ///
38
- /// Defensive parsing: an unparseable / empty URL returns false so the guard never
39
- /// blocks startup on a corrupted host string — the existing host validation in the
40
- /// connection layer remains the authoritative parser.
41
- /// </summary>
42
- public static bool IsNonLoopbackUrl(string? url)
43
- {
44
- if (string.IsNullOrWhiteSpace(url))
45
- return false;
46
-
47
- if (!Uri.TryCreate(url, UriKind.Absolute, out var uri))
48
- return false;
49
-
50
- return IsNonLoopbackHost(uri.Host);
51
- }
52
-
53
- /// <summary>
54
- /// Returns true when the bare host string represents a non-loopback bind target.
55
- /// Used by <see cref="IsNonLoopbackUrl"/> and by callers that already extracted
56
- /// the host (e.g. server arg builders).
57
- /// </summary>
58
- public static bool IsNonLoopbackHost(string? host)
59
- {
60
- if (string.IsNullOrWhiteSpace(host))
61
- return false;
62
-
63
- var h = host.Trim().Trim('[', ']');
64
-
65
- // Wildcard / all-interfaces literals used by Kestrel and friends.
66
- if (h == "0.0.0.0" || h == "::" || h == "*" || h == "+")
67
- return true;
68
-
69
- // Common loopback hostname.
70
- if (h.Equals("localhost", StringComparison.OrdinalIgnoreCase))
71
- return false;
72
-
73
- if (IPAddress.TryParse(h, out var ip))
74
- {
75
- // IPAddress.Loopback covers 127.0.0.1 and ::1; IsLoopback covers the whole
76
- // 127.0.0.0/8 range and the v6 loopback. Anything else (LAN, public, link-local)
77
- // is treated as non-loopback.
78
- return !IPAddress.IsLoopback(ip);
79
- }
80
-
81
- // Non-IP hostnames (LAN names like "build-server.local", public hostnames, etc.)
82
- // are not loopback. The only special case we already handled is "localhost".
83
- return true;
84
- }
85
-
86
- /// <summary>
87
- /// True when the URL uses plain <c>http://</c> AND targets a non-loopback host.
88
- /// HTTPS endpoints, loopback HTTP, and unparseable URLs all return false — the
89
- /// guard does not block them.
90
- /// </summary>
91
- public static bool IsInsecureRemoteHttpUrl(string? url)
92
- {
93
- if (string.IsNullOrWhiteSpace(url))
94
- return false;
95
-
96
- if (!Uri.TryCreate(url, UriKind.Absolute, out var uri))
97
- return false;
98
-
99
- if (!string.Equals(uri.Scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase))
100
- return false;
101
-
102
- return IsNonLoopbackHost(uri.Host);
103
- }
104
-
105
- /// <summary>
106
- /// Pure (no Unity API) evaluation of the fail-closed policy. Returns true when a
107
- /// caller should refuse to start the local MCP server with the supplied configuration.
108
- /// <paramref name="reason"/> contains a human-readable explanation when the result
109
- /// is <c>true</c>; otherwise it is the empty string.
110
- ///
111
- /// Policy:
112
- /// 1. LocalHost resolves to a non-loopback host AND AllowLanBind is false → reject.
113
- /// 2. LocalHost is a non-loopback bind, AllowLanBind is true, but
114
- /// ForceTokenWhenLanBind is true and either AuthOption != required or Token is
115
- /// empty → reject (LAN exposure without a token is a footgun).
116
- /// 3. Otherwise → safe.
117
- ///
118
- /// Insecure remote HTTP is NOT covered here — it is an advisory the configurators
119
- /// emit when they generate client config blocks; the server-start path does not gate
120
- /// on it because the local server is the *target* of the URL, not the *consumer*.
121
- /// </summary>
122
- public static bool ShouldRejectStart(
123
- string? localHost,
124
- bool allowLanBind,
125
- bool forceTokenWhenLanBind,
126
- global::com.AtelierAI.Uco.Framework.Common.Consts.MCP.Server.AuthOption authOption,
127
- string? token,
128
- out string reason)
129
- {
130
- reason = string.Empty;
131
-
132
- var isLan = IsNonLoopbackUrl(localHost);
133
- if (!isLan)
134
- return false;
135
-
136
- if (!allowLanBind)
137
- {
138
- reason =
139
- $"LocalHost '{localHost}' binds to a non-loopback interface but " +
140
- "'Allow LAN Bind' is disabled. Open the Game Developer window → " +
141
- "'Network Safety' section and enable 'Allow LAN Bind' to expose the " +
142
- "MCP server to the network. The safe default is loopback only.";
143
- return true;
144
- }
145
-
146
- if (forceTokenWhenLanBind)
147
- {
148
- var tokenRequired = authOption == global::com.AtelierAI.Uco.Framework.Common.Consts.MCP.Server.AuthOption.required;
149
- if (!tokenRequired || string.IsNullOrEmpty(token))
150
- {
151
- reason =
152
- $"LocalHost '{localHost}' binds to a non-loopback interface but " +
153
- "authorization is not 'required' or the token is empty. Either " +
154
- "set Authorization to 'required' and generate a token, or disable " +
155
- "'Force Token When LAN Bind' in the Game Developer window (not " +
156
- "recommended).";
157
- return true;
158
- }
159
- }
160
-
161
- return false;
162
- }
163
-
164
- /// <summary>
165
- /// Editor-side wrapper that reads the current <see cref="UnityCopilotPluginEditor"/>
166
- /// configuration and delegates to the pure overload. Kept as a thin facade so the
167
- /// pure overload is the unit-testable surface and the editor surface stays small.
168
- /// </summary>
169
- public static bool ShouldRejectStart(out string reason)
170
- {
171
- return ShouldRejectStart(
172
- localHost: UnityCopilotPluginEditor.LocalHost,
173
- allowLanBind: UnityCopilotPluginEditor.AllowLanBind,
174
- forceTokenWhenLanBind: UnityCopilotPluginEditor.ForceTokenWhenLanBind,
175
- authOption: UnityCopilotPluginEditor.AuthOption,
176
- token: UnityCopilotPluginEditor.Token,
177
- out reason);
178
- }
179
- }
180
- }
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.Net;
14
+ using System.Net.Sockets;
15
+
16
+ namespace com.AtelierAI.Unity.Copilot.Editor.Utils
17
+ {
18
+ /// <summary>
19
+ /// Centralised "is the current configuration safe to start?" policy. Implements the
20
+ /// fail-closed posture described on <see cref="UnityCopilotPlugin.UnityConnectionConfig.AllowLanBind"/>:
21
+ /// the local Uco server only auto-starts on a non-loopback bind / over insecure remote HTTP
22
+ /// when the user has explicitly opted in via the corresponding flag, AND any LAN bind
23
+ /// additionally requires a token when <c>ForceTokenWhenLanBind</c> is true.
24
+ ///
25
+ /// The guard is purely advisory at the URL-parsing layer (no Unity API access) so it can be
26
+ /// unit-tested without entering Play mode. The only Unity-side side effect lives in
27
+ /// <see cref="ShouldRejectStart"/>, which reads the editor's current config.
28
+ /// </summary>
29
+ public static class SafeDefaultsGuard
30
+ {
31
+ /// <summary>
32
+ /// Returns true when the given URL has a host that is NOT a loopback address.
33
+ /// Loopback covers <c>localhost</c>, <c>127.0.0.0/8</c>, and <c>::1</c>.
34
+ /// Wildcard binds (<c>0.0.0.0</c>, <c>::</c>, <c>*</c>, <c>+</c>) and concrete LAN IPs
35
+ /// or hostnames are treated as non-loopback (and therefore "LAN bind" for the purposes
36
+ /// of the guard).
37
+ ///
38
+ /// Defensive parsing: an unparseable / empty URL returns false so the guard never
39
+ /// blocks startup on a corrupted host string — the existing host validation in the
40
+ /// connection layer remains the authoritative parser.
41
+ /// </summary>
42
+ public static bool IsNonLoopbackUrl(string? url)
43
+ {
44
+ if (string.IsNullOrWhiteSpace(url))
45
+ return false;
46
+
47
+ if (!Uri.TryCreate(url, UriKind.Absolute, out var uri))
48
+ return false;
49
+
50
+ return IsNonLoopbackHost(uri.Host);
51
+ }
52
+
53
+ /// <summary>
54
+ /// Returns true when the bare host string represents a non-loopback bind target.
55
+ /// Used by <see cref="IsNonLoopbackUrl"/> and by callers that already extracted
56
+ /// the host (e.g. server arg builders).
57
+ /// </summary>
58
+ public static bool IsNonLoopbackHost(string? host)
59
+ {
60
+ if (string.IsNullOrWhiteSpace(host))
61
+ return false;
62
+
63
+ var h = host.Trim().Trim('[', ']');
64
+
65
+ // Wildcard / all-interfaces literals used by Kestrel and friends.
66
+ if (h == "0.0.0.0" || h == "::" || h == "*" || h == "+")
67
+ return true;
68
+
69
+ // Common loopback hostname.
70
+ if (h.Equals("localhost", StringComparison.OrdinalIgnoreCase))
71
+ return false;
72
+
73
+ if (IPAddress.TryParse(h, out var ip))
74
+ {
75
+ // IPAddress.Loopback covers 127.0.0.1 and ::1; IsLoopback covers the whole
76
+ // 127.0.0.0/8 range and the v6 loopback. Anything else (LAN, public, link-local)
77
+ // is treated as non-loopback.
78
+ return !IPAddress.IsLoopback(ip);
79
+ }
80
+
81
+ // Non-IP hostnames (LAN names like "build-server.local", public hostnames, etc.)
82
+ // are not loopback. The only special case we already handled is "localhost".
83
+ return true;
84
+ }
85
+
86
+ /// <summary>
87
+ /// True when the URL uses plain <c>http://</c> AND targets a non-loopback host.
88
+ /// HTTPS endpoints, loopback HTTP, and unparseable URLs all return false — the
89
+ /// guard does not block them.
90
+ /// </summary>
91
+ public static bool IsInsecureRemoteHttpUrl(string? url)
92
+ {
93
+ if (string.IsNullOrWhiteSpace(url))
94
+ return false;
95
+
96
+ if (!Uri.TryCreate(url, UriKind.Absolute, out var uri))
97
+ return false;
98
+
99
+ if (!string.Equals(uri.Scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase))
100
+ return false;
101
+
102
+ return IsNonLoopbackHost(uri.Host);
103
+ }
104
+
105
+ /// <summary>
106
+ /// Pure (no Unity API) evaluation of the fail-closed policy. Returns true when a
107
+ /// caller should refuse to start the local Uco server with the supplied configuration.
108
+ /// <paramref name="reason"/> contains a human-readable explanation when the result
109
+ /// is <c>true</c>; otherwise it is the empty string.
110
+ ///
111
+ /// Policy:
112
+ /// 1. LocalHost resolves to a non-loopback host AND AllowLanBind is false → reject.
113
+ /// 2. LocalHost is a non-loopback bind, AllowLanBind is true, but
114
+ /// ForceTokenWhenLanBind is true and either AuthOption != required or Token is
115
+ /// empty → reject (LAN exposure without a token is a footgun).
116
+ /// 3. Otherwise → safe.
117
+ ///
118
+ /// Insecure remote HTTP is NOT covered here — it is an advisory the configurators
119
+ /// emit when they generate client config blocks; the server-start path does not gate
120
+ /// on it because the local server is the *target* of the URL, not the *consumer*.
121
+ /// </summary>
122
+ public static bool ShouldRejectStart(
123
+ string? localHost,
124
+ bool allowLanBind,
125
+ bool forceTokenWhenLanBind,
126
+ global::com.AtelierAI.Uco.Framework.Common.Consts.Uco.Server.AuthOption authOption,
127
+ string? token,
128
+ out string reason)
129
+ {
130
+ reason = string.Empty;
131
+
132
+ var isLan = IsNonLoopbackUrl(localHost);
133
+ if (!isLan)
134
+ return false;
135
+
136
+ if (!allowLanBind)
137
+ {
138
+ reason =
139
+ $"LocalHost '{localHost}' binds to a non-loopback interface but " +
140
+ "'Allow LAN Bind' is disabled. Open the Game Developer window → " +
141
+ "'Network Safety' section and enable 'Allow LAN Bind' to expose the " +
142
+ "Uco server to the network. The safe default is loopback only.";
143
+ return true;
144
+ }
145
+
146
+ if (forceTokenWhenLanBind)
147
+ {
148
+ var tokenRequired = authOption == global::com.AtelierAI.Uco.Framework.Common.Consts.Uco.Server.AuthOption.required;
149
+ if (!tokenRequired || string.IsNullOrEmpty(token))
150
+ {
151
+ reason =
152
+ $"LocalHost '{localHost}' binds to a non-loopback interface but " +
153
+ "authorization is not 'required' or the token is empty. Either " +
154
+ "set Authorization to 'required' and generate a token, or disable " +
155
+ "'Force Token When LAN Bind' in the Game Developer window (not " +
156
+ "recommended).";
157
+ return true;
158
+ }
159
+ }
160
+
161
+ return false;
162
+ }
163
+
164
+ /// <summary>
165
+ /// Editor-side wrapper that reads the current <see cref="UnityCopilotPluginEditor"/>
166
+ /// configuration and delegates to the pure overload. Kept as a thin facade so the
167
+ /// pure overload is the unit-testable surface and the editor surface stays small.
168
+ /// </summary>
169
+ public static bool ShouldRejectStart(out string reason)
170
+ {
171
+ return ShouldRejectStart(
172
+ localHost: UnityCopilotPluginEditor.LocalHost,
173
+ allowLanBind: UnityCopilotPluginEditor.AllowLanBind,
174
+ forceTokenWhenLanBind: UnityCopilotPluginEditor.ForceTokenWhenLanBind,
175
+ authOption: UnityCopilotPluginEditor.AuthOption,
176
+ token: UnityCopilotPluginEditor.Token,
177
+ out reason);
178
+ }
179
+ }
180
+ }