@romanilyin/canonicalpath 2026.5.18-2
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/LICENSE.md +331 -0
- package/LICENSE.ru.md +331 -0
- package/NOTICE.md +45 -0
- package/README.md +10 -0
- package/dist/canonicalfs/errors.d.ts +8 -0
- package/dist/canonicalfs/errors.d.ts.map +1 -0
- package/dist/canonicalfs/errors.js +19 -0
- package/dist/canonicalfs/errors.js.map +1 -0
- package/dist/canonicalfs/http.d.ts +29 -0
- package/dist/canonicalfs/http.d.ts.map +1 -0
- package/dist/canonicalfs/http.js +107 -0
- package/dist/canonicalfs/http.js.map +1 -0
- package/dist/canonicalfs/index.d.ts +8 -0
- package/dist/canonicalfs/index.d.ts.map +1 -0
- package/dist/canonicalfs/index.js +8 -0
- package/dist/canonicalfs/index.js.map +1 -0
- package/dist/canonicalfs/limitations.d.ts +2 -0
- package/dist/canonicalfs/limitations.d.ts.map +1 -0
- package/dist/canonicalfs/limitations.js +2 -0
- package/dist/canonicalfs/limitations.js.map +1 -0
- package/dist/canonicalfs/root.d.ts +17 -0
- package/dist/canonicalfs/root.d.ts.map +1 -0
- package/dist/canonicalfs/root.js +51 -0
- package/dist/canonicalfs/root.js.map +1 -0
- package/dist/canonicalfs/rpc.d.ts +15 -0
- package/dist/canonicalfs/rpc.d.ts.map +1 -0
- package/dist/canonicalfs/rpc.js +31 -0
- package/dist/canonicalfs/rpc.js.map +1 -0
- package/dist/canonicalfs/types.d.ts +25 -0
- package/dist/canonicalfs/types.d.ts.map +1 -0
- package/dist/canonicalfs/types.js +2 -0
- package/dist/canonicalfs/types.js.map +1 -0
- package/dist/canonicalfs/validate.d.ts +3 -0
- package/dist/canonicalfs/validate.d.ts.map +1 -0
- package/dist/canonicalfs/validate.js +36 -0
- package/dist/canonicalfs/validate.js.map +1 -0
- package/dist/canonicalpath/equal.d.ts +3 -0
- package/dist/canonicalpath/equal.d.ts.map +1 -0
- package/dist/canonicalpath/equal.js +5 -0
- package/dist/canonicalpath/equal.js.map +1 -0
- package/dist/canonicalpath/errors.d.ts +8 -0
- package/dist/canonicalpath/errors.d.ts.map +1 -0
- package/dist/canonicalpath/errors.js +19 -0
- package/dist/canonicalpath/errors.js.map +1 -0
- package/dist/canonicalpath/index.d.ts +11 -0
- package/dist/canonicalpath/index.d.ts.map +1 -0
- package/dist/canonicalpath/index.js +11 -0
- package/dist/canonicalpath/index.js.map +1 -0
- package/dist/canonicalpath/internal.d.ts +22 -0
- package/dist/canonicalpath/internal.d.ts.map +1 -0
- package/dist/canonicalpath/internal.js +135 -0
- package/dist/canonicalpath/internal.js.map +1 -0
- package/dist/canonicalpath/normalize.d.ts +3 -0
- package/dist/canonicalpath/normalize.d.ts.map +1 -0
- package/dist/canonicalpath/normalize.js +56 -0
- package/dist/canonicalpath/normalize.js.map +1 -0
- package/dist/canonicalpath/posix.d.ts +3 -0
- package/dist/canonicalpath/posix.d.ts.map +1 -0
- package/dist/canonicalpath/posix.js +13 -0
- package/dist/canonicalpath/posix.js.map +1 -0
- package/dist/canonicalpath/relative.d.ts +5 -0
- package/dist/canonicalpath/relative.d.ts.map +1 -0
- package/dist/canonicalpath/relative.js +57 -0
- package/dist/canonicalpath/relative.js.map +1 -0
- package/dist/canonicalpath/sanitize.d.ts +4 -0
- package/dist/canonicalpath/sanitize.d.ts.map +1 -0
- package/dist/canonicalpath/sanitize.js +36 -0
- package/dist/canonicalpath/sanitize.js.map +1 -0
- package/dist/canonicalpath/types.d.ts +28 -0
- package/dist/canonicalpath/types.d.ts.map +1 -0
- package/dist/canonicalpath/types.js +2 -0
- package/dist/canonicalpath/types.js.map +1 -0
- package/dist/canonicalpath/uri.d.ts +3 -0
- package/dist/canonicalpath/uri.d.ts.map +1 -0
- package/dist/canonicalpath/uri.js +49 -0
- package/dist/canonicalpath/uri.js.map +1 -0
- package/dist/canonicalpath/windows.d.ts +3 -0
- package/dist/canonicalpath/windows.d.ts.map +1 -0
- package/dist/canonicalpath/windows.js +12 -0
- package/dist/canonicalpath/windows.js.map +1 -0
- package/dist/canonicalpath/wsl.d.ts +5 -0
- package/dist/canonicalpath/wsl.d.ts.map +1 -0
- package/dist/canonicalpath/wsl.js +15 -0
- package/dist/canonicalpath/wsl.js.map +1 -0
- package/dist/unity-gateway/broker.d.ts +21 -0
- package/dist/unity-gateway/broker.d.ts.map +1 -0
- package/dist/unity-gateway/broker.js +140 -0
- package/dist/unity-gateway/broker.js.map +1 -0
- package/dist/unity-gateway/fake-bridge.d.ts +33 -0
- package/dist/unity-gateway/fake-bridge.d.ts.map +1 -0
- package/dist/unity-gateway/fake-bridge.js +214 -0
- package/dist/unity-gateway/fake-bridge.js.map +1 -0
- package/dist/unity-gateway/index.d.ts +6 -0
- package/dist/unity-gateway/index.d.ts.map +1 -0
- package/dist/unity-gateway/index.js +6 -0
- package/dist/unity-gateway/index.js.map +1 -0
- package/dist/unity-gateway/mcp-tools.d.ts +12 -0
- package/dist/unity-gateway/mcp-tools.d.ts.map +1 -0
- package/dist/unity-gateway/mcp-tools.js +265 -0
- package/dist/unity-gateway/mcp-tools.js.map +1 -0
- package/dist/unity-gateway/path-service.d.ts +25 -0
- package/dist/unity-gateway/path-service.d.ts.map +1 -0
- package/dist/unity-gateway/path-service.js +233 -0
- package/dist/unity-gateway/path-service.js.map +1 -0
- package/dist/unity-gateway/types.d.ts +168 -0
- package/dist/unity-gateway/types.d.ts.map +1 -0
- package/dist/unity-gateway/types.js +2 -0
- package/dist/unity-gateway/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { errorCode } from "../canonicalpath/errors.js";
|
|
2
|
+
export const unityMCPToolNames = [
|
|
3
|
+
"unity.status",
|
|
4
|
+
"unity.projectInfo",
|
|
5
|
+
"unity.readLog",
|
|
6
|
+
"unity.read",
|
|
7
|
+
"unity.validatePath",
|
|
8
|
+
"unity.knowledge.read",
|
|
9
|
+
"unity.knowledge.write",
|
|
10
|
+
"unity.knowledge.list",
|
|
11
|
+
"unity.knowledge.glob",
|
|
12
|
+
"unity.artifact.read",
|
|
13
|
+
"unity.artifact.write",
|
|
14
|
+
"unity.artifact.list",
|
|
15
|
+
"unity.artifact.glob",
|
|
16
|
+
"unity.assets.refresh",
|
|
17
|
+
"unity.scene.save",
|
|
18
|
+
"unity.asset.import",
|
|
19
|
+
"unity.prefab.create",
|
|
20
|
+
"unity.module.create",
|
|
21
|
+
];
|
|
22
|
+
export class UnityMCPToolRegistry {
|
|
23
|
+
bridge;
|
|
24
|
+
constructor(bridge) {
|
|
25
|
+
this.bridge = bridge;
|
|
26
|
+
}
|
|
27
|
+
listTools() {
|
|
28
|
+
return unityToolDescriptors;
|
|
29
|
+
}
|
|
30
|
+
async callTool(name, args = {}) {
|
|
31
|
+
try {
|
|
32
|
+
const value = await this.callToolStrict(name, args);
|
|
33
|
+
return toolResult(value);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return toolResult({ error: errorCode(error), message: errorMessage(error) }, true);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async callToolStrict(name, args) {
|
|
40
|
+
const input = objectArgs(args);
|
|
41
|
+
switch (name) {
|
|
42
|
+
case "unity.status":
|
|
43
|
+
return this.bridge.status(optionalString(input, "project_id"));
|
|
44
|
+
case "unity.projectInfo":
|
|
45
|
+
return this.bridge.projectInfo(requiredString(input, "project_id"));
|
|
46
|
+
case "unity.readLog":
|
|
47
|
+
return this.bridge.readLog(optionalString(input, "project_id"), optionalInteger(input, "max_entries"));
|
|
48
|
+
case "unity.read":
|
|
49
|
+
return this.bridge.readText(requiredString(input, "project_id"), requiredString(input, "unity_path"), optionalInteger(input, "max_chars"));
|
|
50
|
+
case "unity.validatePath":
|
|
51
|
+
return this.bridge.validatePath(requiredString(input, "project_id"), requiredString(input, "unity_path"), validationOptions(input));
|
|
52
|
+
case "unity.knowledge.read":
|
|
53
|
+
return this.bridge.readScopedText(requiredString(input, "project_id"), "knowledge", requiredString(input, "path"), optionalInteger(input, "max_chars"));
|
|
54
|
+
case "unity.knowledge.write":
|
|
55
|
+
return this.bridge.writeScopedText(requiredString(input, "project_id"), "knowledge", requiredString(input, "path"), requiredString(input, "text"), optionalInteger(input, "max_chars"));
|
|
56
|
+
case "unity.knowledge.list":
|
|
57
|
+
return this.bridge.listScoped(requiredString(input, "project_id"), "knowledge", optionalString(input, "path_prefix"), optionalInteger(input, "max_entries"));
|
|
58
|
+
case "unity.knowledge.glob":
|
|
59
|
+
return this.bridge.globScoped(requiredString(input, "project_id"), "knowledge", requiredString(input, "glob"), optionalInteger(input, "max_entries"));
|
|
60
|
+
case "unity.artifact.read":
|
|
61
|
+
return this.bridge.readScopedText(requiredString(input, "project_id"), "artifact", requiredString(input, "path"), optionalInteger(input, "max_chars"));
|
|
62
|
+
case "unity.artifact.write":
|
|
63
|
+
return this.bridge.writeScopedText(requiredString(input, "project_id"), "artifact", requiredString(input, "path"), requiredString(input, "text"), optionalInteger(input, "max_chars"));
|
|
64
|
+
case "unity.artifact.list":
|
|
65
|
+
return this.bridge.listScoped(requiredString(input, "project_id"), "artifact", optionalString(input, "path_prefix"), optionalInteger(input, "max_entries"));
|
|
66
|
+
case "unity.artifact.glob":
|
|
67
|
+
return this.bridge.globScoped(requiredString(input, "project_id"), "artifact", requiredString(input, "glob"), optionalInteger(input, "max_entries"));
|
|
68
|
+
case "unity.assets.refresh":
|
|
69
|
+
return this.bridge.writeCommand("assets.refresh", writeRequest(input, false));
|
|
70
|
+
case "unity.scene.save":
|
|
71
|
+
return this.bridge.writeCommand("scene.save", writeRequest(input, true));
|
|
72
|
+
case "unity.asset.import":
|
|
73
|
+
return this.bridge.writeCommand("asset.import", writeRequest(input, true));
|
|
74
|
+
case "unity.prefab.create":
|
|
75
|
+
return this.bridge.writeCommand("prefab.create", writeRequest(input, true));
|
|
76
|
+
case "unity.module.create":
|
|
77
|
+
return this.bridge.writeCommand("module.create", writeRequest(input, true));
|
|
78
|
+
default:
|
|
79
|
+
throw new Error(`unsupported Unity MCP tool ${name}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function createUnityMCPTools(bridge) {
|
|
84
|
+
return new UnityMCPToolRegistry(bridge);
|
|
85
|
+
}
|
|
86
|
+
const unityToolDescriptors = [
|
|
87
|
+
{
|
|
88
|
+
name: "unity.status",
|
|
89
|
+
description: "Report fake or real Unity bridge status without mutating the project.",
|
|
90
|
+
inputSchema: objectSchema({ project_id: { type: "string" } }),
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "unity.projectInfo",
|
|
94
|
+
description: "Return registered Unity project identity and bridge metadata.",
|
|
95
|
+
inputSchema: objectSchema({ project_id: { type: "string" } }, ["project_id"]),
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "unity.readLog",
|
|
99
|
+
description: "Read recent Unity bridge log entries from the fake or real bridge.",
|
|
100
|
+
inputSchema: objectSchema({ project_id: { type: "string" }, max_entries: { type: "integer", minimum: 1 } }),
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: "unity.read",
|
|
104
|
+
description: "Read a validated Assets/... or Packages/... text file through the fake or real Unity bridge.",
|
|
105
|
+
inputSchema: objectSchema({
|
|
106
|
+
project_id: { type: "string" },
|
|
107
|
+
unity_path: { type: "string" },
|
|
108
|
+
max_chars: { type: "integer", minimum: 1 },
|
|
109
|
+
}, ["project_id", "unity_path"]),
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "unity.validatePath",
|
|
113
|
+
description: "Dry-run Unity PathGuard validation for Assets/... or Packages/... payload paths.",
|
|
114
|
+
inputSchema: objectSchema({
|
|
115
|
+
project_id: { type: "string" },
|
|
116
|
+
unity_path: { type: "string" },
|
|
117
|
+
generated_file_name: { type: "string" },
|
|
118
|
+
max_file_name_length: { type: "integer", minimum: 1 },
|
|
119
|
+
}, ["project_id", "unity_path"]),
|
|
120
|
+
},
|
|
121
|
+
scopedReadTool("unity.knowledge.read", "knowledge"),
|
|
122
|
+
scopedWriteTool("unity.knowledge.write", "knowledge"),
|
|
123
|
+
scopedListTool("unity.knowledge.list", "knowledge"),
|
|
124
|
+
scopedGlobTool("unity.knowledge.glob", "knowledge"),
|
|
125
|
+
scopedReadTool("unity.artifact.read", "artifact"),
|
|
126
|
+
scopedWriteTool("unity.artifact.write", "artifact"),
|
|
127
|
+
scopedListTool("unity.artifact.list", "artifact"),
|
|
128
|
+
scopedGlobTool("unity.artifact.glob", "artifact"),
|
|
129
|
+
writeTool("unity.assets.refresh", "assets.refresh", false),
|
|
130
|
+
writeTool("unity.scene.save", "scene.save", true),
|
|
131
|
+
writeTool("unity.asset.import", "asset.import", true),
|
|
132
|
+
writeTool("unity.prefab.create", "prefab.create", true),
|
|
133
|
+
writeTool("unity.module.create", "module.create", true),
|
|
134
|
+
];
|
|
135
|
+
function toolResult(value, isError = false) {
|
|
136
|
+
return {
|
|
137
|
+
content: [{ type: "text", text: JSON.stringify(value) }],
|
|
138
|
+
structuredContent: value,
|
|
139
|
+
isError: isError || undefined,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function objectSchema(properties, required = []) {
|
|
143
|
+
return { type: "object", properties, required, additionalProperties: false };
|
|
144
|
+
}
|
|
145
|
+
function objectArgs(value) {
|
|
146
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value))
|
|
147
|
+
return value;
|
|
148
|
+
throw new Error("tool args must be an object");
|
|
149
|
+
}
|
|
150
|
+
function requiredString(args, key) {
|
|
151
|
+
const value = args[key];
|
|
152
|
+
if (typeof value !== "string" || value === "")
|
|
153
|
+
throw new Error(`${key} must be a non-empty string`);
|
|
154
|
+
return value;
|
|
155
|
+
}
|
|
156
|
+
function optionalString(args, key) {
|
|
157
|
+
const value = args[key];
|
|
158
|
+
if (value === undefined)
|
|
159
|
+
return undefined;
|
|
160
|
+
if (typeof value !== "string" || value === "")
|
|
161
|
+
throw new Error(`${key} must be a non-empty string when provided`);
|
|
162
|
+
return value;
|
|
163
|
+
}
|
|
164
|
+
function optionalInteger(args, key) {
|
|
165
|
+
const value = args[key];
|
|
166
|
+
if (value === undefined)
|
|
167
|
+
return undefined;
|
|
168
|
+
if (!Number.isInteger(value))
|
|
169
|
+
throw new Error(`${key} must be an integer when provided`);
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
function validationOptions(args) {
|
|
173
|
+
return {
|
|
174
|
+
generatedFileName: optionalString(args, "generated_file_name"),
|
|
175
|
+
maxFileNameLength: optionalInteger(args, "max_file_name_length"),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function writeRequest(args, requirePath) {
|
|
179
|
+
const unityPath = requirePath ? requiredString(args, "unity_path") : optionalString(args, "unity_path");
|
|
180
|
+
return {
|
|
181
|
+
projectId: requiredString(args, "project_id"),
|
|
182
|
+
unityPath,
|
|
183
|
+
generatedFileName: optionalString(args, "generated_file_name"),
|
|
184
|
+
dryRun: optionalBoolean(args, "dry_run"),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function optionalBoolean(args, key) {
|
|
188
|
+
const value = args[key];
|
|
189
|
+
if (value === undefined)
|
|
190
|
+
return undefined;
|
|
191
|
+
if (typeof value !== "boolean")
|
|
192
|
+
throw new Error(`${key} must be a boolean when provided`);
|
|
193
|
+
return value;
|
|
194
|
+
}
|
|
195
|
+
function writeTool(name, command, requirePath) {
|
|
196
|
+
const properties = {
|
|
197
|
+
project_id: { type: "string" },
|
|
198
|
+
dry_run: { type: "boolean" },
|
|
199
|
+
};
|
|
200
|
+
const required = ["project_id"];
|
|
201
|
+
if (requirePath) {
|
|
202
|
+
properties.unity_path = { type: "string" };
|
|
203
|
+
required.push("unity_path");
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
properties.unity_path = { type: "string" };
|
|
207
|
+
}
|
|
208
|
+
properties.generated_file_name = { type: "string" };
|
|
209
|
+
return {
|
|
210
|
+
name,
|
|
211
|
+
description: `Validate and dispatch guarded Unity write command ${command}. Fake bridge records only; real bridge must call PathGuard before performing writes.`,
|
|
212
|
+
inputSchema: objectSchema(properties, required),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function scopedReadTool(name, scope) {
|
|
216
|
+
return {
|
|
217
|
+
name,
|
|
218
|
+
description: `Read bounded ${scope} text through a scoped path. Real filesystem I/O must delegate to the Go daemon.`,
|
|
219
|
+
inputSchema: objectSchema({
|
|
220
|
+
project_id: { type: "string" },
|
|
221
|
+
path: { type: "string" },
|
|
222
|
+
max_chars: { type: "integer", minimum: 1, maximum: 1_048_576 },
|
|
223
|
+
}, ["project_id", "path"]),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function scopedWriteTool(name, scope) {
|
|
227
|
+
return {
|
|
228
|
+
name,
|
|
229
|
+
description: `Write bounded ${scope} text through a scoped path. Fake bridge stores in memory; real filesystem I/O must delegate to the Go daemon.`,
|
|
230
|
+
inputSchema: objectSchema({
|
|
231
|
+
project_id: { type: "string" },
|
|
232
|
+
path: { type: "string" },
|
|
233
|
+
text: { type: "string", maxLength: 1_048_576 },
|
|
234
|
+
max_chars: { type: "integer", minimum: 1, maximum: 1_048_576 },
|
|
235
|
+
}, ["project_id", "path", "text"]),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function scopedListTool(name, scope) {
|
|
239
|
+
return {
|
|
240
|
+
name,
|
|
241
|
+
description: `List bounded ${scope} entries by scope-relative prefix without returning host paths.`,
|
|
242
|
+
inputSchema: objectSchema({
|
|
243
|
+
project_id: { type: "string" },
|
|
244
|
+
path_prefix: { type: "string" },
|
|
245
|
+
max_entries: { type: "integer", minimum: 1, maximum: 1000 },
|
|
246
|
+
}, ["project_id"]),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function scopedGlobTool(name, scope) {
|
|
250
|
+
return {
|
|
251
|
+
name,
|
|
252
|
+
description: `Match bounded ${scope} entries by scope-relative glob without using host filesystem globs.`,
|
|
253
|
+
inputSchema: objectSchema({
|
|
254
|
+
project_id: { type: "string" },
|
|
255
|
+
glob: { type: "string", minLength: 1, maxLength: 512 },
|
|
256
|
+
max_entries: { type: "integer", minimum: 1, maximum: 1000 },
|
|
257
|
+
}, ["project_id", "glob"]),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function errorMessage(error) {
|
|
261
|
+
if (error instanceof Error)
|
|
262
|
+
return error.message;
|
|
263
|
+
return String(error);
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=mcp-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../src/unity-gateway/mcp-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CanonicalPath, CanonicalRelativePath, NormalizeOptions } from "../canonicalpath/types.js";
|
|
2
|
+
export type UnityMcpPathScope = "unity_asset" | "knowledge" | "package_manifest" | "artifact" | "gateway_cache" | "temp_session";
|
|
3
|
+
export type UnityMcpWorkflowScope = Extract<UnityMcpPathScope, "knowledge" | "artifact">;
|
|
4
|
+
export type ScopedPathKind = "project" | "cache";
|
|
5
|
+
export interface ScopedPathResult {
|
|
6
|
+
scope: UnityMcpPathScope;
|
|
7
|
+
kind: ScopedPathKind;
|
|
8
|
+
path: CanonicalRelativePath;
|
|
9
|
+
}
|
|
10
|
+
export declare class CanonicalPathService {
|
|
11
|
+
normalize(raw: string, options?: NormalizeOptions): CanonicalPath;
|
|
12
|
+
normalizeProjectRoot(raw: string, options?: NormalizeOptions): CanonicalPath;
|
|
13
|
+
normalizeUnityAssetPath(raw: string): CanonicalRelativePath;
|
|
14
|
+
normalizeScopedPath(scope: UnityMcpPathScope, raw: string): ScopedPathResult;
|
|
15
|
+
normalizeScopedGlobPattern(scope: UnityMcpWorkflowScope, raw: string): CanonicalRelativePath;
|
|
16
|
+
toScopedCanonicalPath(projectRoot: CanonicalPath, scope: UnityMcpPathScope, raw: string): CanonicalPath;
|
|
17
|
+
fromUnityAssetPath(projectRoot: CanonicalPath, unityPath: string): CanonicalPath;
|
|
18
|
+
toUnityAssetPath(projectRoot: CanonicalPath, fullPath: CanonicalPath): CanonicalRelativePath;
|
|
19
|
+
assertInsideProject(projectRoot: CanonicalPath, candidate: CanonicalPath): void;
|
|
20
|
+
makeSafeFileName(input: string, maxLength?: number): string;
|
|
21
|
+
}
|
|
22
|
+
export declare function normalizeScopedPath(scope: UnityMcpPathScope, raw: string): ScopedPathResult;
|
|
23
|
+
export declare function toScopedCanonicalPath(projectRoot: CanonicalPath, scope: UnityMcpPathScope, raw: string): CanonicalPath;
|
|
24
|
+
export declare function normalizeScopedGlobPattern(scope: UnityMcpWorkflowScope, raw: string): CanonicalRelativePath;
|
|
25
|
+
//# sourceMappingURL=path-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-service.d.ts","sourceRoot":"","sources":["../../src/unity-gateway/path-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAExG,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,GAAG,UAAU,GAAG,eAAe,GAAG,cAAc,CAAC;AACjI,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;AACzF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,qBAAqB,CAAC;CAC7B;AAED,qBAAa,oBAAoB;IAC/B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,aAAa;IAIrE,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,aAAa;IAMhF,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB;IAmB3D,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB;IAI5E,0BAA0B,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,qBAAqB;IAI5F,qBAAqB,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa;IAIvG,kBAAkB,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa;IAIhF,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,GAAG,qBAAqB;IAI5F,mBAAmB,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI;IAI/E,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,MAAM;CAkBzD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAoB3F;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAItH;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAS3G"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { join, normalize, normalizeRelative, relative } from "../canonicalpath/index.js";
|
|
3
|
+
import { pathError } from "../canonicalpath/errors.js";
|
|
4
|
+
export class CanonicalPathService {
|
|
5
|
+
normalize(raw, options = {}) {
|
|
6
|
+
return normalize(raw, options);
|
|
7
|
+
}
|
|
8
|
+
normalizeProjectRoot(raw, options = {}) {
|
|
9
|
+
const projectRoot = normalize(raw, options);
|
|
10
|
+
if (projectRoot === ".")
|
|
11
|
+
throw pathError("ERR_INVALID_PATH", "Unity project root must be absolute");
|
|
12
|
+
return projectRoot;
|
|
13
|
+
}
|
|
14
|
+
normalizeUnityAssetPath(raw) {
|
|
15
|
+
if (raw === "")
|
|
16
|
+
throw pathError("ERR_EMPTY_PATH", "Unity path is empty");
|
|
17
|
+
if (raw.includes("\0"))
|
|
18
|
+
throw pathError("ERR_NUL_BYTE", "Unity path contains NUL");
|
|
19
|
+
const value = raw.replaceAll("\\", "/");
|
|
20
|
+
if (/^[A-Za-z]:/.test(value)) {
|
|
21
|
+
throw pathError("ERR_ABSOLUTE_PATH", "Unity path must not be drive-qualified");
|
|
22
|
+
}
|
|
23
|
+
if (value.split("/").includes("..")) {
|
|
24
|
+
throw pathError("ERR_OUTSIDE_ROOT", "Unity path traversal is not allowed");
|
|
25
|
+
}
|
|
26
|
+
const clean = normalizeRelative(value);
|
|
27
|
+
if (!isAllowedUnityRoot(clean)) {
|
|
28
|
+
throw pathError("ERR_INVALID_PATH", "Unity path must start with Assets/ or Packages/");
|
|
29
|
+
}
|
|
30
|
+
return clean;
|
|
31
|
+
}
|
|
32
|
+
normalizeScopedPath(scope, raw) {
|
|
33
|
+
return normalizeScopedPath(scope, raw);
|
|
34
|
+
}
|
|
35
|
+
normalizeScopedGlobPattern(scope, raw) {
|
|
36
|
+
return normalizeScopedGlobPattern(scope, raw);
|
|
37
|
+
}
|
|
38
|
+
toScopedCanonicalPath(projectRoot, scope, raw) {
|
|
39
|
+
return toScopedCanonicalPath(projectRoot, scope, raw);
|
|
40
|
+
}
|
|
41
|
+
fromUnityAssetPath(projectRoot, unityPath) {
|
|
42
|
+
return join(projectRoot, this.normalizeUnityAssetPath(unityPath));
|
|
43
|
+
}
|
|
44
|
+
toUnityAssetPath(projectRoot, fullPath) {
|
|
45
|
+
return this.normalizeUnityAssetPath(relative(projectRoot, fullPath));
|
|
46
|
+
}
|
|
47
|
+
assertInsideProject(projectRoot, candidate) {
|
|
48
|
+
relative(projectRoot, candidate);
|
|
49
|
+
}
|
|
50
|
+
makeSafeFileName(input, maxLength = 128) {
|
|
51
|
+
if (!Number.isInteger(maxLength) || maxLength < 1) {
|
|
52
|
+
throw pathError("ERR_INVALID_COMPONENT", "maxLength must be a positive integer");
|
|
53
|
+
}
|
|
54
|
+
if (input === "")
|
|
55
|
+
throw pathError("ERR_INVALID_COMPONENT", "file name input is empty");
|
|
56
|
+
if (input.includes("\0"))
|
|
57
|
+
throw pathError("ERR_NUL_BYTE", "file name input contains NUL");
|
|
58
|
+
let safe = input.replace(/[\\/:\t\n\r]+/g, "-").replace(/^[ ._-]+|[ ._-]+$/g, "");
|
|
59
|
+
if (safe === "")
|
|
60
|
+
safe = "file";
|
|
61
|
+
safe = escapeReservedWin32Component(safe);
|
|
62
|
+
if (safe.length <= maxLength)
|
|
63
|
+
return safe;
|
|
64
|
+
if (maxLength <= 10)
|
|
65
|
+
return trimGeneratedName(safe.slice(0, maxLength));
|
|
66
|
+
const hash = createHash("sha256").update(input, "utf8").digest("hex").slice(0, 8);
|
|
67
|
+
const prefix = trimGeneratedName(safe.slice(0, maxLength - 10));
|
|
68
|
+
return `${prefix}--${hash}`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function normalizeScopedPath(scope, raw) {
|
|
72
|
+
const clean = validateScopedRelativeInput(raw);
|
|
73
|
+
switch (scope) {
|
|
74
|
+
case "unity_asset":
|
|
75
|
+
return scopedProjectPath(scope, clean, startsWithAny(clean, ["Assets", "Packages"]));
|
|
76
|
+
case "package_manifest":
|
|
77
|
+
return packageManifestPath(scope, clean);
|
|
78
|
+
case "knowledge":
|
|
79
|
+
return prefixedScopedProjectPath(scope, "Assets/UnityMcpKnowledge", clean, isPlainScopeRelative(clean));
|
|
80
|
+
case "artifact":
|
|
81
|
+
return prefixedScopedProjectPath(scope, "Library/SGGUnityMcp", clean, startsWithAny(clean, ["job-artifacts", "screenshots"]));
|
|
82
|
+
case "gateway_cache":
|
|
83
|
+
if (!startsWithAny(clean, ["index"]))
|
|
84
|
+
throw pathError("ERR_OUTSIDE_ROOT", "gateway cache path must be under index/");
|
|
85
|
+
return { scope, kind: "cache", path: clean };
|
|
86
|
+
case "temp_session":
|
|
87
|
+
return prefixedScopedProjectPath(scope, "Temp/SGGUnityMcp", clean, isPlainScopeRelative(clean));
|
|
88
|
+
default:
|
|
89
|
+
throw pathError("ERR_INVALID_PATH", "unsupported Unity MCP path scope");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function toScopedCanonicalPath(projectRoot, scope, raw) {
|
|
93
|
+
const result = normalizeScopedPath(scope, raw);
|
|
94
|
+
if (result.kind !== "project")
|
|
95
|
+
throw pathError("ERR_INVALID_PATH", "cache scoped paths are not project paths");
|
|
96
|
+
return join(projectRoot, result.path);
|
|
97
|
+
}
|
|
98
|
+
export function normalizeScopedGlobPattern(scope, raw) {
|
|
99
|
+
if (scope !== "knowledge" && scope !== "artifact")
|
|
100
|
+
throw pathError("ERR_INVALID_PATH", "bounded workflow glob scope must be knowledge or artifact");
|
|
101
|
+
const clean = validateScopedGlobInput(raw);
|
|
102
|
+
if (scope === "artifact") {
|
|
103
|
+
if (!startsWithAny(clean, ["job-artifacts", "screenshots"]))
|
|
104
|
+
throw pathError("ERR_OUTSIDE_ROOT", "artifact glob must be under job-artifacts/ or screenshots/");
|
|
105
|
+
}
|
|
106
|
+
else if (!isPlainScopeGlob(clean)) {
|
|
107
|
+
throw pathError("ERR_OUTSIDE_ROOT", "knowledge glob is outside its allowed root");
|
|
108
|
+
}
|
|
109
|
+
return clean;
|
|
110
|
+
}
|
|
111
|
+
function isAllowedUnityRoot(value) {
|
|
112
|
+
return value === "Assets" || value.startsWith("Assets/") || value === "Packages" || value.startsWith("Packages/");
|
|
113
|
+
}
|
|
114
|
+
function validateScopedRelativeInput(raw) {
|
|
115
|
+
if (raw === "")
|
|
116
|
+
throw pathError("ERR_EMPTY_PATH", "scoped path is empty");
|
|
117
|
+
if (raw.includes("\0"))
|
|
118
|
+
throw pathError("ERR_NUL_BYTE", "scoped path contains NUL");
|
|
119
|
+
if (/^file:\/\//i.test(raw))
|
|
120
|
+
throw pathError("ERR_UNSUPPORTED_URI_SCHEME", "file URI is not allowed");
|
|
121
|
+
if (/%(?:2f|5c|252f|255c)/i.test(raw))
|
|
122
|
+
throw pathError("ERR_ENCODED_SEPARATOR", "encoded path separators are not allowed");
|
|
123
|
+
if (raw.startsWith("/") || raw.startsWith("\\\\") || /^[A-Za-z]:[\\/]/.test(raw))
|
|
124
|
+
throw pathError("ERR_ABSOLUTE_PATH", "scoped path must be relative");
|
|
125
|
+
if (/^[A-Za-z]:($|[^\\/])/.test(raw))
|
|
126
|
+
throw pathError("ERR_DRIVE_RELATIVE_PATH", "drive-relative scoped paths are not allowed");
|
|
127
|
+
if (raw.includes("\\"))
|
|
128
|
+
throw pathError("ERR_INVALID_PATH", "scoped paths must use slash separators");
|
|
129
|
+
const parts = raw.split("/");
|
|
130
|
+
if (parts.some((part) => part === ".."))
|
|
131
|
+
throw pathError("ERR_OUTSIDE_ROOT", "scoped path traversal is not allowed");
|
|
132
|
+
if (parts.some((part) => part === "" || part === "." || part.includes(":") || part.endsWith(".") || part.endsWith(" "))) {
|
|
133
|
+
throw pathError("ERR_INVALID_PATH", "scoped path contains an invalid component");
|
|
134
|
+
}
|
|
135
|
+
if (raw.length > 4096 || parts.some((part) => part.length > 255))
|
|
136
|
+
throw pathError("ERR_INVALID_PATH", "scoped path exceeds length limits");
|
|
137
|
+
return raw;
|
|
138
|
+
}
|
|
139
|
+
function validateScopedGlobInput(raw) {
|
|
140
|
+
if (raw === "")
|
|
141
|
+
throw pathError("ERR_EMPTY_PATH", "scoped glob is empty");
|
|
142
|
+
if (raw.length > 512)
|
|
143
|
+
throw pathError("ERR_INVALID_PATH", "scoped glob exceeds length limit");
|
|
144
|
+
if (!raw.includes("*") && !raw.includes("?"))
|
|
145
|
+
throw pathError("ERR_INVALID_PATH", "scoped glob must contain a wildcard");
|
|
146
|
+
if (raw.includes("\0"))
|
|
147
|
+
throw pathError("ERR_NUL_BYTE", "scoped glob contains NUL");
|
|
148
|
+
if (/^file:\/\//i.test(raw))
|
|
149
|
+
throw pathError("ERR_UNSUPPORTED_URI_SCHEME", "file URI is not allowed");
|
|
150
|
+
if (/%(?:2f|5c|252f|255c)/i.test(raw))
|
|
151
|
+
throw pathError("ERR_ENCODED_SEPARATOR", "encoded path separators are not allowed");
|
|
152
|
+
if (raw.startsWith("/") || raw.startsWith("\\\\") || /^[A-Za-z]:[\\/]/.test(raw))
|
|
153
|
+
throw pathError("ERR_ABSOLUTE_PATH", "scoped glob must be relative");
|
|
154
|
+
if (/^[A-Za-z]:($|[^\\/])/.test(raw))
|
|
155
|
+
throw pathError("ERR_DRIVE_RELATIVE_PATH", "drive-relative scoped globs are not allowed");
|
|
156
|
+
if (raw.includes("\\"))
|
|
157
|
+
throw pathError("ERR_INVALID_PATH", "scoped globs must use slash separators");
|
|
158
|
+
const parts = raw.split("/");
|
|
159
|
+
if (parts.some((part) => part === ".."))
|
|
160
|
+
throw pathError("ERR_OUTSIDE_ROOT", "scoped glob traversal is not allowed");
|
|
161
|
+
if (parts.some((part) => part === "" || part === "." || part.includes(":")))
|
|
162
|
+
throw pathError("ERR_INVALID_PATH", "scoped glob contains an invalid component");
|
|
163
|
+
if (parts.some((part) => part.endsWith(".") || part.endsWith(" ") || part.length > 255))
|
|
164
|
+
throw pathError("ERR_INVALID_PATH", "scoped glob component exceeds policy limits");
|
|
165
|
+
return raw;
|
|
166
|
+
}
|
|
167
|
+
function scopedProjectPath(scope, path, allowed) {
|
|
168
|
+
if (!allowed)
|
|
169
|
+
throw pathError("ERR_OUTSIDE_ROOT", "scoped path is outside its allowed root");
|
|
170
|
+
return { scope, kind: "project", path };
|
|
171
|
+
}
|
|
172
|
+
function packageManifestPath(scope, path) {
|
|
173
|
+
if (path.startsWith("Packages/manifest.json/") || path.startsWith("Packages/packages-lock.json/")) {
|
|
174
|
+
throw pathError("ERR_INVALID_PATH", "package manifest scope only accepts exact manifest files");
|
|
175
|
+
}
|
|
176
|
+
return scopedProjectPath(scope, path, path === "Packages/manifest.json" || path === "Packages/packages-lock.json");
|
|
177
|
+
}
|
|
178
|
+
function prefixedScopedProjectPath(scope, root, path, allowed) {
|
|
179
|
+
if (!allowed)
|
|
180
|
+
throw pathError("ERR_OUTSIDE_ROOT", "scoped path is outside its allowed root");
|
|
181
|
+
return { scope, kind: "project", path: `${root}/${path}` };
|
|
182
|
+
}
|
|
183
|
+
function isPlainScopeRelative(value) {
|
|
184
|
+
return !startsWithAny(value, [
|
|
185
|
+
"Assets",
|
|
186
|
+
"AssetsEvil",
|
|
187
|
+
"Packages",
|
|
188
|
+
"PackagesEvil",
|
|
189
|
+
"ProjectSettings",
|
|
190
|
+
"Library",
|
|
191
|
+
"Temp",
|
|
192
|
+
"UnityMcpKnowledge",
|
|
193
|
+
"UnityMcpKnowledgeEvil",
|
|
194
|
+
"UnityMcpArtifacts",
|
|
195
|
+
"UnityMcpGatewayCache",
|
|
196
|
+
"UnityMcpTempSession",
|
|
197
|
+
]);
|
|
198
|
+
}
|
|
199
|
+
function isPlainScopeGlob(value) {
|
|
200
|
+
const firstComponent = value.split("/")[0] ?? "";
|
|
201
|
+
const literalPrefix = firstComponent.replace(/[?*].*$/, "");
|
|
202
|
+
return !startsWithAny(literalPrefix, [
|
|
203
|
+
"Assets",
|
|
204
|
+
"AssetsEvil",
|
|
205
|
+
"Packages",
|
|
206
|
+
"PackagesEvil",
|
|
207
|
+
"ProjectSettings",
|
|
208
|
+
"Library",
|
|
209
|
+
"Temp",
|
|
210
|
+
"UnityMcpKnowledge",
|
|
211
|
+
"UnityMcpKnowledgeEvil",
|
|
212
|
+
"UnityMcpArtifacts",
|
|
213
|
+
"UnityMcpGatewayCache",
|
|
214
|
+
"UnityMcpTempSession",
|
|
215
|
+
]);
|
|
216
|
+
}
|
|
217
|
+
function startsWithAny(value, roots) {
|
|
218
|
+
return roots.some((root) => value === root || value.startsWith(`${root}/`));
|
|
219
|
+
}
|
|
220
|
+
function trimGeneratedName(value) {
|
|
221
|
+
return value.replace(/[ ._-]+$/g, "") || "file";
|
|
222
|
+
}
|
|
223
|
+
function escapeReservedWin32Component(value) {
|
|
224
|
+
const dot = value.indexOf(".");
|
|
225
|
+
const base = dot >= 0 ? value.slice(0, dot) : value;
|
|
226
|
+
const suffix = dot >= 0 ? value.slice(dot) : "";
|
|
227
|
+
return isReservedDeviceBase(base) ? `${base}-${suffix}` : value;
|
|
228
|
+
}
|
|
229
|
+
function isReservedDeviceBase(value) {
|
|
230
|
+
const upper = value.toUpperCase();
|
|
231
|
+
return upper === "CON" || upper === "PRN" || upper === "AUX" || upper === "NUL" || /^(COM|LPT)[1-9]$/.test(upper);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=path-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-service.js","sourceRoot":"","sources":["../../src/unity-gateway/path-service.ts"],"names":[],"mappings":"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"}
|