@atelierai/uco 1.0.7 → 1.0.9

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 (107) hide show
  1. package/CHANGELOG.md +29 -8
  2. package/package.json +2 -2
  3. package/vendor/plugin/com.atelierai.unity.copilot/CHANGELOG.md +4 -4
  4. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetConfig.cs +132 -132
  5. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDependencyResolver.cs +237 -237
  6. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDownloader.cs +82 -82
  7. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/MenuItems.cs +247 -247
  8. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/ToolGroups.cs +153 -153
  9. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/SystemTool/Skills.Create.SkillBody.cs +155 -155
  10. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Console.GetLogs.cs +95 -95
  11. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Docs.HttpFetcher.cs +139 -139
  12. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Instance.ListAll.cs +72 -72
  13. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/PathReadHelper.cs +106 -106
  14. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Script.Validate.cs +252 -252
  15. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests/TestResultCollector.cs +537 -537
  16. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests.cs +400 -400
  17. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/ToolGroups.SetEnabled.cs +92 -92
  18. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Branding/ProductInfo.cs +62 -62
  19. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/CopilotServerManager.cs +887 -1034
  20. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Skills/Skill_InitialSetup.cs +197 -197
  21. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.Editor.cs +201 -201
  22. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.cs +67 -67
  23. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotListWindowBase.cs +393 -393
  24. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotWindowBase.cs +113 -113
  25. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.Connection.cs +3 -3
  26. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotFeatures.cs +195 -195
  27. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotServer.cs +22 -22
  28. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CreateGUI.cs +354 -354
  29. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.cs +78 -78
  30. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowInitializer.cs +47 -47
  31. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/SerializationCheckWindow.cs +190 -190
  32. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Build.cs +91 -91
  33. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Config.cs +298 -298
  34. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Static.cs +296 -296
  35. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.cs +69 -69
  36. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PackageUtils.cs +168 -168
  37. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PrefsKeyMigration.cs +119 -119
  38. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/SafeDefaultsGuard.cs +180 -180
  39. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ScriptUtils.cs +229 -229
  40. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolGroupRegistry.cs +461 -460
  41. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolsManifestGenerator.cs +200 -200
  42. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringAdapters.cs +1467 -1467
  43. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringSafetyReloadGuard.cs +65 -65
  44. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityCopilotUpdateProjectSettings.cs +66 -66
  45. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotPromptsWindow.uss +11 -11
  46. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotResourcesWindow.uss +16 -16
  47. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotToolsWindow.uss +36 -36
  48. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/MainWindow.uss +183 -183
  49. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/{_mcp-list-window.uss → _copilot-list-window.uss} +18 -18
  50. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/_list-view.uss +77 -77
  51. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotPromptsWindow.uxml +18 -18
  52. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotResourcesWindow.uxml +18 -18
  53. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotToolsWindow.uxml +18 -18
  54. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/MainWindow.uxml +115 -115
  55. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/ReflectorNet.dll +0 -0
  56. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.Common.dll +0 -0
  57. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.dll +0 -0
  58. package/vendor/plugin/com.atelierai.unity.copilot/README.md +88 -88
  59. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Converter/Json/Structures/EntityIdConverter.cs +120 -120
  60. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.cs +110 -110
  61. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.pre-Unity.6.5.cs +110 -110
  62. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Unity/Logs/FileLogStorage.cs +547 -547
  63. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Build.cs +243 -243
  64. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Config.cs +3 -3
  65. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.cs +295 -295
  66. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginBuilder.cs +105 -105
  67. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.Static.cs +155 -155
  68. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.cs +59 -59
  69. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Utils/EnvironmentUtils.cs +11 -11
  70. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/AtomicApiTestFixtures.cs +99 -99
  71. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/TryModifyAtTests.cs +227 -227
  72. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AuthoringSafetyPilotTests.cs +1050 -1050
  73. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetExtractorDevelopmentDependencyTests.cs +148 -148
  74. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetExtractorFlatLayoutTests.cs +166 -166
  75. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetInstallManifestTests.cs +436 -436
  76. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
  77. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetPackageInstallerStaleVersionCleanupTests.cs +200 -200
  78. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +2 -2
  79. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/BlacklistTypeTests.cs +416 -416
  80. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.cs +172 -172
  81. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.pre-Unity.6.5.cs +169 -169
  82. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.cs +182 -182
  83. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.pre-Unity.6.5.cs +179 -179
  84. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.cs +175 -175
  85. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.pre-Unity.6.5.cs +174 -174
  86. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.cs +171 -171
  87. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.pre-Unity.6.5.cs +170 -170
  88. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsCreateFolderTests.cs +243 -243
  89. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsMaterialTests.cs +101 -101
  90. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs +348 -348
  91. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.pre-Unity.6.5.cs +348 -348
  92. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsShaderTests.cs +194 -194
  93. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/GameObject/TestJsonSchema.cs +199 -199
  94. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.cs +573 -573
  95. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.pre-Unity.6.5.cs +513 -513
  96. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.cs +154 -154
  97. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.pre-Unity.6.5.cs +154 -154
  98. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotGameViewTests.cs +164 -164
  99. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotSceneViewTests.cs +155 -155
  100. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolParameterTests.cs +56 -56
  101. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.cs +651 -651
  102. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.pre-Unity.6.5.cs +651 -651
  103. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ToolBatchExecutionIntegrationTests.cs +407 -407
  104. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs → UcoPluginTests.cs} +105 -105
  105. package/vendor/plugin/com.atelierai.unity.copilot/package.json +1 -1
  106. /package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/{_mcp-list-window.uss.meta → _copilot-list-window.uss.meta} +0 -0
  107. /package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs.meta → UcoPluginTests.cs.meta} +0 -0
@@ -1,120 +1,120 @@
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
- // Wire contract for EntityId (Unity 6.5+):
12
- // On the wire: JSON string of decimal digits, e.g. "568105584918935294".
13
- // No sign, no leading zeros, no exponent.
14
- // Schema: { "type": "string", "pattern": "^[0-9]+$" }.
15
- //
16
- // Outbound: always emitted as a JSON string (via WriteStringValue).
17
- // Inbound: accepts both a JSON string (preferred) and a JSON number
18
- // (back-compat — legacy clients pre-#759 wrote a number).
19
- //
20
- // Rationale: Unity 6.5's EntityId is a 64-bit ulong. JS-based MCP clients
21
- // (Claude Agent SDK, etc.) parse JSON numbers as IEEE-754 doubles, so any
22
- // value past 2^53 - 1 rounds. Serializing as a string makes the value
23
- // opaque to every JSON parser, preserving full precision through any
24
- // language boundary. This is the same pattern used by Twitter, YouTube,
25
- // Discord, Stripe, and gRPC-JSON for 64-bit IDs. See #759 / #754.
26
-
27
- #nullable enable
28
- #if UNITY_6000_5_OR_NEWER
29
- using System;
30
- using System.Globalization;
31
- using System.Text.Json;
32
- using System.Text.Json.Nodes;
33
- using com.IvanMurzak.ReflectorNet.Json;
34
- using com.IvanMurzak.ReflectorNet.Utils;
35
- using com.AtelierAI.Unity.Copilot.Runtime.Utils;
36
- using UnityEngine;
37
-
38
- namespace com.AtelierAI.Unity.Copilot.JsonConverters
39
- {
40
- public class EntityIdConverter : JsonSchemaConverter<EntityId>, IJsonSchemaConverter
41
- {
42
- public override JsonNode GetSchema() => new JsonObject
43
- {
44
- [JsonSchema.Type] = JsonSchema.String,
45
- [JsonSchema.Pattern] = "^[0-9]+$"
46
- };
47
- public override JsonNode GetSchemaRef() => new JsonObject
48
- {
49
- [JsonSchema.Ref] = JsonSchema.RefValue + Id
50
- };
51
-
52
- public override EntityId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
53
- {
54
- if (reader.TokenType == JsonTokenType.Null)
55
- return EntityId.None;
56
-
57
- if (reader.TokenType != JsonTokenType.String && reader.TokenType != JsonTokenType.Number)
58
- throw new JsonException($"Expected string or number token for {nameof(EntityId)}, got {reader.TokenType}.");
59
-
60
- return ReadEntityIdValue(ref reader);
61
- }
62
-
63
- // Accept three JSON representations:
64
- // 1. String token — the new on-wire format (decimal digits, see top-of-file).
65
- // 2. Legacy int form from EntityId.ToString (handwritten JSON).
66
- // 3. Raw ulong from EntityId.ToULong (machine-serialized JSON).
67
- // All three round-trip correctly.
68
- internal static EntityId ReadEntityIdValue(ref Utf8JsonReader reader)
69
- {
70
- // String token — the new on-wire format.
71
- if (reader.TokenType == JsonTokenType.String)
72
- {
73
- var stringValue = reader.GetString();
74
- // Reject empty string up-front: the schema regex "^[0-9]+$" requires
75
- // one or more digits, but EntityIdUtils.FromString("") returns
76
- // EntityId.None silently. Throw here so the runtime matches the
77
- // published schema (see #759 wire contract at top-of-file).
78
- if (string.IsNullOrEmpty(stringValue))
79
- throw new JsonException($"{nameof(EntityId)} string must be one or more decimal digits, got empty string.");
80
- return EntityIdUtils.FromString(stringValue);
81
- }
82
-
83
- if (reader.TryGetInt64(out var signedValue))
84
- return EntityIdUtils.FromNumber(signedValue);
85
-
86
- if (reader.TryGetUInt64(out var unsignedValue))
87
- return EntityIdUtils.FromRawValue(unsignedValue);
88
-
89
- // Fallback for numeric tokens STJ 8's TryGet* helpers reject
90
- // (e.g. numbers re-serialized through JsonElement that end up with
91
- // a fractional trailing zero). Parse the raw token text ourselves.
92
- byte[] rawBytes;
93
- if (reader.HasValueSequence)
94
- {
95
- var seq = reader.ValueSequence;
96
- rawBytes = new byte[seq.Length];
97
- var offset = 0;
98
- foreach (var mem in seq)
99
- {
100
- mem.Span.CopyTo(new Span<byte>(rawBytes, offset, mem.Length));
101
- offset += mem.Length;
102
- }
103
- }
104
- else
105
- {
106
- rawBytes = reader.ValueSpan.ToArray();
107
- }
108
- return EntityIdUtils.FromString(System.Text.Encoding.UTF8.GetString(rawBytes));
109
- }
110
-
111
- public override void Write(Utf8JsonWriter writer, EntityId value, JsonSerializerOptions options)
112
- {
113
- // Outbound: always a JSON string of decimal digits so JS clients
114
- // can JSON.parse the payload without IEEE-754 precision loss
115
- // (see top-of-file wire contract).
116
- writer.WriteStringValue(EntityId.ToULong(value).ToString(CultureInfo.InvariantCulture));
117
- }
118
- }
119
- }
120
- #endif
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
+ // Wire contract for EntityId (Unity 6.5+):
12
+ // On the wire: JSON string of decimal digits, e.g. "568105584918935294".
13
+ // No sign, no leading zeros, no exponent.
14
+ // Schema: { "type": "string", "pattern": "^[0-9]+$" }.
15
+ //
16
+ // Outbound: always emitted as a JSON string (via WriteStringValue).
17
+ // Inbound: accepts both a JSON string (preferred) and a JSON number
18
+ // (back-compat — legacy clients pre-#759 wrote a number).
19
+ //
20
+ // Rationale: Unity 6.5's EntityId is a 64-bit ulong. JS-based Uco clients
21
+ // (Claude Agent SDK, etc.) parse JSON numbers as IEEE-754 doubles, so any
22
+ // value past 2^53 - 1 rounds. Serializing as a string makes the value
23
+ // opaque to every JSON parser, preserving full precision through any
24
+ // language boundary. This is the same pattern used by Twitter, YouTube,
25
+ // Discord, Stripe, and gRPC-JSON for 64-bit IDs. See #759 / #754.
26
+
27
+ #nullable enable
28
+ #if UNITY_6000_5_OR_NEWER
29
+ using System;
30
+ using System.Globalization;
31
+ using System.Text.Json;
32
+ using System.Text.Json.Nodes;
33
+ using com.IvanMurzak.ReflectorNet.Json;
34
+ using com.IvanMurzak.ReflectorNet.Utils;
35
+ using com.AtelierAI.Unity.Copilot.Runtime.Utils;
36
+ using UnityEngine;
37
+
38
+ namespace com.AtelierAI.Unity.Copilot.JsonConverters
39
+ {
40
+ public class EntityIdConverter : JsonSchemaConverter<EntityId>, IJsonSchemaConverter
41
+ {
42
+ public override JsonNode GetSchema() => new JsonObject
43
+ {
44
+ [JsonSchema.Type] = JsonSchema.String,
45
+ [JsonSchema.Pattern] = "^[0-9]+$"
46
+ };
47
+ public override JsonNode GetSchemaRef() => new JsonObject
48
+ {
49
+ [JsonSchema.Ref] = JsonSchema.RefValue + Id
50
+ };
51
+
52
+ public override EntityId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
53
+ {
54
+ if (reader.TokenType == JsonTokenType.Null)
55
+ return EntityId.None;
56
+
57
+ if (reader.TokenType != JsonTokenType.String && reader.TokenType != JsonTokenType.Number)
58
+ throw new JsonException($"Expected string or number token for {nameof(EntityId)}, got {reader.TokenType}.");
59
+
60
+ return ReadEntityIdValue(ref reader);
61
+ }
62
+
63
+ // Accept three JSON representations:
64
+ // 1. String token — the new on-wire format (decimal digits, see top-of-file).
65
+ // 2. Legacy int form from EntityId.ToString (handwritten JSON).
66
+ // 3. Raw ulong from EntityId.ToULong (machine-serialized JSON).
67
+ // All three round-trip correctly.
68
+ internal static EntityId ReadEntityIdValue(ref Utf8JsonReader reader)
69
+ {
70
+ // String token — the new on-wire format.
71
+ if (reader.TokenType == JsonTokenType.String)
72
+ {
73
+ var stringValue = reader.GetString();
74
+ // Reject empty string up-front: the schema regex "^[0-9]+$" requires
75
+ // one or more digits, but EntityIdUtils.FromString("") returns
76
+ // EntityId.None silently. Throw here so the runtime matches the
77
+ // published schema (see #759 wire contract at top-of-file).
78
+ if (string.IsNullOrEmpty(stringValue))
79
+ throw new JsonException($"{nameof(EntityId)} string must be one or more decimal digits, got empty string.");
80
+ return EntityIdUtils.FromString(stringValue);
81
+ }
82
+
83
+ if (reader.TryGetInt64(out var signedValue))
84
+ return EntityIdUtils.FromNumber(signedValue);
85
+
86
+ if (reader.TryGetUInt64(out var unsignedValue))
87
+ return EntityIdUtils.FromRawValue(unsignedValue);
88
+
89
+ // Fallback for numeric tokens STJ 8's TryGet* helpers reject
90
+ // (e.g. numbers re-serialized through JsonElement that end up with
91
+ // a fractional trailing zero). Parse the raw token text ourselves.
92
+ byte[] rawBytes;
93
+ if (reader.HasValueSequence)
94
+ {
95
+ var seq = reader.ValueSequence;
96
+ rawBytes = new byte[seq.Length];
97
+ var offset = 0;
98
+ foreach (var mem in seq)
99
+ {
100
+ mem.Span.CopyTo(new Span<byte>(rawBytes, offset, mem.Length));
101
+ offset += mem.Length;
102
+ }
103
+ }
104
+ else
105
+ {
106
+ rawBytes = reader.ValueSpan.ToArray();
107
+ }
108
+ return EntityIdUtils.FromString(System.Text.Encoding.UTF8.GetString(rawBytes));
109
+ }
110
+
111
+ public override void Write(Utf8JsonWriter writer, EntityId value, JsonSerializerOptions options)
112
+ {
113
+ // Outbound: always a JSON string of decimal digits so JS clients
114
+ // can JSON.parse the payload without IEEE-754 precision loss
115
+ // (see top-of-file wire contract).
116
+ writer.WriteStringValue(EntityId.ToULong(value).ToString(CultureInfo.InvariantCulture));
117
+ }
118
+ }
119
+ }
120
+ #endif
@@ -1,110 +1,110 @@
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
- #if UNITY_6000_5_OR_NEWER
13
- using System.Collections.Generic;
14
- using System.Text;
15
- using com.IvanMurzak.ReflectorNet.Utils;
16
- using com.AtelierAI.Unity.Copilot.Runtime.Utils;
17
- using UnityEngine;
18
-
19
- namespace AIGD
20
- {
21
- public class GameObjectMetadata
22
- {
23
- public UnityEngine.EntityId instanceID = UnityEngine.EntityId.None;
24
- public string? path;
25
- public string? name;
26
- public string? sceneName;
27
- public string? tag;
28
- public bool activeSelf;
29
- public bool activeInHierarchy;
30
- public List<GameObjectMetadata> children = new();
31
-
32
- public string Print(int limit = global::com.AtelierAI.Uco.Framework.Common.Consts.MCP.Plugin.LinesLimit)
33
- {
34
- var sb = new StringBuilder();
35
-
36
- // Add table header
37
- sb.AppendLine("Scene: " + sceneName);
38
- sb.AppendLine("Path to root: " + path);
39
- sb.AppendLine("-------------------------------------------------------------------------");
40
- sb.AppendLine("instanceID | activeInHierarchy | activeSelf | tag | name");
41
- sb.AppendLine("-----------|-------------------|------------|-----------|----------------");
42
-
43
- // Add the current GameObject's metadata
44
- AppendMetadata(sb, this, depth: 0, ref limit);
45
-
46
- return sb.ToString();
47
- }
48
-
49
- public static void AppendMetadata(StringBuilder sb, GameObjectMetadata metadata, int depth, ref int limit)
50
- {
51
- var padding = StringUtils.GetPadding(depth);
52
- if (limit <= 0)
53
- {
54
- sb.AppendLine($"{padding}... [Limit reached] ...");
55
- return;
56
- }
57
- limit--;
58
- // Indent the path based on depth for better readability
59
- var indentedPath = $"{padding}{metadata.name}";
60
-
61
- // Add the current GameObject's data
62
- sb.AppendLine($"{metadata.instanceID,-10} | {metadata.activeInHierarchy,-17} | {metadata.activeSelf,-10} | {metadata.tag,-9} | {indentedPath}");
63
-
64
- // Recursively add children
65
- var paddingForChildren = StringUtils.GetPadding(depth + 1);
66
- foreach (var child in metadata.children)
67
- {
68
- if (limit <= 0)
69
- {
70
- sb.AppendLine($"{paddingForChildren}... [Limit reached] ...");
71
- return;
72
- }
73
- limit--;
74
- AppendMetadata(sb, child, depth + 1, ref limit);
75
- }
76
- }
77
-
78
- public static GameObjectMetadata? FromGameObject(GameObject go, int includeChildrenDepth = 3)
79
- {
80
- if (go == null)
81
- return null;
82
-
83
- // Create metadata for the GameObject
84
- var metadata = new GameObjectMetadata
85
- {
86
- instanceID = go.GetEntityId(),
87
- path = go.GetPath(),
88
- name = go.name,
89
- sceneName = go.scene.name,
90
- tag = go.tag,
91
- activeSelf = go.activeSelf,
92
- activeInHierarchy = go.activeInHierarchy
93
- };
94
-
95
- if (includeChildrenDepth > 0)
96
- {
97
- metadata.children ??= new();
98
- foreach (Transform child in go.transform)
99
- {
100
- var childMetadata = FromGameObject(child.gameObject, includeChildrenDepth - 1);
101
- if (childMetadata != null)
102
- metadata.children.Add(childMetadata);
103
- }
104
- }
105
-
106
- return metadata;
107
- }
108
- }
109
- }
110
- #endif
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
+ #if UNITY_6000_5_OR_NEWER
13
+ using System.Collections.Generic;
14
+ using System.Text;
15
+ using com.IvanMurzak.ReflectorNet.Utils;
16
+ using com.AtelierAI.Unity.Copilot.Runtime.Utils;
17
+ using UnityEngine;
18
+
19
+ namespace AIGD
20
+ {
21
+ public class GameObjectMetadata
22
+ {
23
+ public UnityEngine.EntityId instanceID = UnityEngine.EntityId.None;
24
+ public string? path;
25
+ public string? name;
26
+ public string? sceneName;
27
+ public string? tag;
28
+ public bool activeSelf;
29
+ public bool activeInHierarchy;
30
+ public List<GameObjectMetadata> children = new();
31
+
32
+ public string Print(int limit = global::com.AtelierAI.Uco.Framework.Common.Consts.Uco.Plugin.LinesLimit)
33
+ {
34
+ var sb = new StringBuilder();
35
+
36
+ // Add table header
37
+ sb.AppendLine("Scene: " + sceneName);
38
+ sb.AppendLine("Path to root: " + path);
39
+ sb.AppendLine("-------------------------------------------------------------------------");
40
+ sb.AppendLine("instanceID | activeInHierarchy | activeSelf | tag | name");
41
+ sb.AppendLine("-----------|-------------------|------------|-----------|----------------");
42
+
43
+ // Add the current GameObject's metadata
44
+ AppendMetadata(sb, this, depth: 0, ref limit);
45
+
46
+ return sb.ToString();
47
+ }
48
+
49
+ public static void AppendMetadata(StringBuilder sb, GameObjectMetadata metadata, int depth, ref int limit)
50
+ {
51
+ var padding = StringUtils.GetPadding(depth);
52
+ if (limit <= 0)
53
+ {
54
+ sb.AppendLine($"{padding}... [Limit reached] ...");
55
+ return;
56
+ }
57
+ limit--;
58
+ // Indent the path based on depth for better readability
59
+ var indentedPath = $"{padding}{metadata.name}";
60
+
61
+ // Add the current GameObject's data
62
+ sb.AppendLine($"{metadata.instanceID,-10} | {metadata.activeInHierarchy,-17} | {metadata.activeSelf,-10} | {metadata.tag,-9} | {indentedPath}");
63
+
64
+ // Recursively add children
65
+ var paddingForChildren = StringUtils.GetPadding(depth + 1);
66
+ foreach (var child in metadata.children)
67
+ {
68
+ if (limit <= 0)
69
+ {
70
+ sb.AppendLine($"{paddingForChildren}... [Limit reached] ...");
71
+ return;
72
+ }
73
+ limit--;
74
+ AppendMetadata(sb, child, depth + 1, ref limit);
75
+ }
76
+ }
77
+
78
+ public static GameObjectMetadata? FromGameObject(GameObject go, int includeChildrenDepth = 3)
79
+ {
80
+ if (go == null)
81
+ return null;
82
+
83
+ // Create metadata for the GameObject
84
+ var metadata = new GameObjectMetadata
85
+ {
86
+ instanceID = go.GetEntityId(),
87
+ path = go.GetPath(),
88
+ name = go.name,
89
+ sceneName = go.scene.name,
90
+ tag = go.tag,
91
+ activeSelf = go.activeSelf,
92
+ activeInHierarchy = go.activeInHierarchy
93
+ };
94
+
95
+ if (includeChildrenDepth > 0)
96
+ {
97
+ metadata.children ??= new();
98
+ foreach (Transform child in go.transform)
99
+ {
100
+ var childMetadata = FromGameObject(child.gameObject, includeChildrenDepth - 1);
101
+ if (childMetadata != null)
102
+ metadata.children.Add(childMetadata);
103
+ }
104
+ }
105
+
106
+ return metadata;
107
+ }
108
+ }
109
+ }
110
+ #endif