@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.
- package/CHANGELOG.md +29 -8
- package/package.json +2 -2
- package/vendor/plugin/com.atelierai.unity.copilot/CHANGELOG.md +4 -4
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetConfig.cs +132 -132
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDependencyResolver.cs +237 -237
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDownloader.cs +82 -82
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/MenuItems.cs +247 -247
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/ToolGroups.cs +153 -153
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/SystemTool/Skills.Create.SkillBody.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Console.GetLogs.cs +95 -95
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Docs.HttpFetcher.cs +139 -139
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Instance.ListAll.cs +72 -72
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/PathReadHelper.cs +106 -106
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Script.Validate.cs +252 -252
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests/TestResultCollector.cs +537 -537
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests.cs +400 -400
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/ToolGroups.SetEnabled.cs +92 -92
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Branding/ProductInfo.cs +62 -62
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/CopilotServerManager.cs +887 -1034
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Skills/Skill_InitialSetup.cs +197 -197
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.Editor.cs +201 -201
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.cs +67 -67
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotListWindowBase.cs +393 -393
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotWindowBase.cs +113 -113
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.Connection.cs +3 -3
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotFeatures.cs +195 -195
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotServer.cs +22 -22
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CreateGUI.cs +354 -354
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.cs +78 -78
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowInitializer.cs +47 -47
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/SerializationCheckWindow.cs +190 -190
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Build.cs +91 -91
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Config.cs +298 -298
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Static.cs +296 -296
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.cs +69 -69
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PackageUtils.cs +168 -168
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PrefsKeyMigration.cs +119 -119
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/SafeDefaultsGuard.cs +180 -180
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ScriptUtils.cs +229 -229
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolGroupRegistry.cs +461 -460
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolsManifestGenerator.cs +200 -200
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringAdapters.cs +1467 -1467
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringSafetyReloadGuard.cs +65 -65
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityCopilotUpdateProjectSettings.cs +66 -66
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotPromptsWindow.uss +11 -11
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotResourcesWindow.uss +16 -16
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotToolsWindow.uss +36 -36
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/MainWindow.uss +183 -183
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/{_mcp-list-window.uss → _copilot-list-window.uss} +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/_list-view.uss +77 -77
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotPromptsWindow.uxml +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotResourcesWindow.uxml +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotToolsWindow.uxml +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/MainWindow.uxml +115 -115
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/ReflectorNet.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.Common.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/README.md +88 -88
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Converter/Json/Structures/EntityIdConverter.cs +120 -120
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.cs +110 -110
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.pre-Unity.6.5.cs +110 -110
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Unity/Logs/FileLogStorage.cs +547 -547
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Build.cs +243 -243
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Config.cs +3 -3
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.cs +295 -295
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginBuilder.cs +105 -105
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.Static.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.cs +59 -59
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Utils/EnvironmentUtils.cs +11 -11
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/AtomicApiTestFixtures.cs +99 -99
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/TryModifyAtTests.cs +227 -227
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AuthoringSafetyPilotTests.cs +1050 -1050
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetExtractorDevelopmentDependencyTests.cs +148 -148
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetExtractorFlatLayoutTests.cs +166 -166
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetInstallManifestTests.cs +436 -436
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetPackageInstallerStaleVersionCleanupTests.cs +200 -200
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +2 -2
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/BlacklistTypeTests.cs +416 -416
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.cs +172 -172
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.pre-Unity.6.5.cs +169 -169
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.cs +182 -182
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.pre-Unity.6.5.cs +179 -179
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.cs +175 -175
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.pre-Unity.6.5.cs +174 -174
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.cs +171 -171
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.pre-Unity.6.5.cs +170 -170
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsCreateFolderTests.cs +243 -243
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsMaterialTests.cs +101 -101
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs +348 -348
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.pre-Unity.6.5.cs +348 -348
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsShaderTests.cs +194 -194
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/GameObject/TestJsonSchema.cs +199 -199
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.cs +573 -573
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.pre-Unity.6.5.cs +513 -513
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.cs +154 -154
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.pre-Unity.6.5.cs +154 -154
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotGameViewTests.cs +164 -164
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotSceneViewTests.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolParameterTests.cs +56 -56
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.cs +651 -651
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.pre-Unity.6.5.cs +651 -651
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ToolBatchExecutionIntegrationTests.cs +407 -407
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs → UcoPluginTests.cs} +105 -105
- package/vendor/plugin/com.atelierai.unity.copilot/package.json +1 -1
- /package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/{_mcp-list-window.uss.meta → _copilot-list-window.uss.meta} +0 -0
- /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
|
|
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.
|
|
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
|