@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.
Files changed (109) hide show
  1. package/LICENSE.md +331 -0
  2. package/LICENSE.ru.md +331 -0
  3. package/NOTICE.md +45 -0
  4. package/README.md +10 -0
  5. package/dist/canonicalfs/errors.d.ts +8 -0
  6. package/dist/canonicalfs/errors.d.ts.map +1 -0
  7. package/dist/canonicalfs/errors.js +19 -0
  8. package/dist/canonicalfs/errors.js.map +1 -0
  9. package/dist/canonicalfs/http.d.ts +29 -0
  10. package/dist/canonicalfs/http.d.ts.map +1 -0
  11. package/dist/canonicalfs/http.js +107 -0
  12. package/dist/canonicalfs/http.js.map +1 -0
  13. package/dist/canonicalfs/index.d.ts +8 -0
  14. package/dist/canonicalfs/index.d.ts.map +1 -0
  15. package/dist/canonicalfs/index.js +8 -0
  16. package/dist/canonicalfs/index.js.map +1 -0
  17. package/dist/canonicalfs/limitations.d.ts +2 -0
  18. package/dist/canonicalfs/limitations.d.ts.map +1 -0
  19. package/dist/canonicalfs/limitations.js +2 -0
  20. package/dist/canonicalfs/limitations.js.map +1 -0
  21. package/dist/canonicalfs/root.d.ts +17 -0
  22. package/dist/canonicalfs/root.d.ts.map +1 -0
  23. package/dist/canonicalfs/root.js +51 -0
  24. package/dist/canonicalfs/root.js.map +1 -0
  25. package/dist/canonicalfs/rpc.d.ts +15 -0
  26. package/dist/canonicalfs/rpc.d.ts.map +1 -0
  27. package/dist/canonicalfs/rpc.js +31 -0
  28. package/dist/canonicalfs/rpc.js.map +1 -0
  29. package/dist/canonicalfs/types.d.ts +25 -0
  30. package/dist/canonicalfs/types.d.ts.map +1 -0
  31. package/dist/canonicalfs/types.js +2 -0
  32. package/dist/canonicalfs/types.js.map +1 -0
  33. package/dist/canonicalfs/validate.d.ts +3 -0
  34. package/dist/canonicalfs/validate.d.ts.map +1 -0
  35. package/dist/canonicalfs/validate.js +36 -0
  36. package/dist/canonicalfs/validate.js.map +1 -0
  37. package/dist/canonicalpath/equal.d.ts +3 -0
  38. package/dist/canonicalpath/equal.d.ts.map +1 -0
  39. package/dist/canonicalpath/equal.js +5 -0
  40. package/dist/canonicalpath/equal.js.map +1 -0
  41. package/dist/canonicalpath/errors.d.ts +8 -0
  42. package/dist/canonicalpath/errors.d.ts.map +1 -0
  43. package/dist/canonicalpath/errors.js +19 -0
  44. package/dist/canonicalpath/errors.js.map +1 -0
  45. package/dist/canonicalpath/index.d.ts +11 -0
  46. package/dist/canonicalpath/index.d.ts.map +1 -0
  47. package/dist/canonicalpath/index.js +11 -0
  48. package/dist/canonicalpath/index.js.map +1 -0
  49. package/dist/canonicalpath/internal.d.ts +22 -0
  50. package/dist/canonicalpath/internal.d.ts.map +1 -0
  51. package/dist/canonicalpath/internal.js +135 -0
  52. package/dist/canonicalpath/internal.js.map +1 -0
  53. package/dist/canonicalpath/normalize.d.ts +3 -0
  54. package/dist/canonicalpath/normalize.d.ts.map +1 -0
  55. package/dist/canonicalpath/normalize.js +56 -0
  56. package/dist/canonicalpath/normalize.js.map +1 -0
  57. package/dist/canonicalpath/posix.d.ts +3 -0
  58. package/dist/canonicalpath/posix.d.ts.map +1 -0
  59. package/dist/canonicalpath/posix.js +13 -0
  60. package/dist/canonicalpath/posix.js.map +1 -0
  61. package/dist/canonicalpath/relative.d.ts +5 -0
  62. package/dist/canonicalpath/relative.d.ts.map +1 -0
  63. package/dist/canonicalpath/relative.js +57 -0
  64. package/dist/canonicalpath/relative.js.map +1 -0
  65. package/dist/canonicalpath/sanitize.d.ts +4 -0
  66. package/dist/canonicalpath/sanitize.d.ts.map +1 -0
  67. package/dist/canonicalpath/sanitize.js +36 -0
  68. package/dist/canonicalpath/sanitize.js.map +1 -0
  69. package/dist/canonicalpath/types.d.ts +28 -0
  70. package/dist/canonicalpath/types.d.ts.map +1 -0
  71. package/dist/canonicalpath/types.js +2 -0
  72. package/dist/canonicalpath/types.js.map +1 -0
  73. package/dist/canonicalpath/uri.d.ts +3 -0
  74. package/dist/canonicalpath/uri.d.ts.map +1 -0
  75. package/dist/canonicalpath/uri.js +49 -0
  76. package/dist/canonicalpath/uri.js.map +1 -0
  77. package/dist/canonicalpath/windows.d.ts +3 -0
  78. package/dist/canonicalpath/windows.d.ts.map +1 -0
  79. package/dist/canonicalpath/windows.js +12 -0
  80. package/dist/canonicalpath/windows.js.map +1 -0
  81. package/dist/canonicalpath/wsl.d.ts +5 -0
  82. package/dist/canonicalpath/wsl.d.ts.map +1 -0
  83. package/dist/canonicalpath/wsl.js +15 -0
  84. package/dist/canonicalpath/wsl.js.map +1 -0
  85. package/dist/unity-gateway/broker.d.ts +21 -0
  86. package/dist/unity-gateway/broker.d.ts.map +1 -0
  87. package/dist/unity-gateway/broker.js +140 -0
  88. package/dist/unity-gateway/broker.js.map +1 -0
  89. package/dist/unity-gateway/fake-bridge.d.ts +33 -0
  90. package/dist/unity-gateway/fake-bridge.d.ts.map +1 -0
  91. package/dist/unity-gateway/fake-bridge.js +214 -0
  92. package/dist/unity-gateway/fake-bridge.js.map +1 -0
  93. package/dist/unity-gateway/index.d.ts +6 -0
  94. package/dist/unity-gateway/index.d.ts.map +1 -0
  95. package/dist/unity-gateway/index.js +6 -0
  96. package/dist/unity-gateway/index.js.map +1 -0
  97. package/dist/unity-gateway/mcp-tools.d.ts +12 -0
  98. package/dist/unity-gateway/mcp-tools.d.ts.map +1 -0
  99. package/dist/unity-gateway/mcp-tools.js +265 -0
  100. package/dist/unity-gateway/mcp-tools.js.map +1 -0
  101. package/dist/unity-gateway/path-service.d.ts +25 -0
  102. package/dist/unity-gateway/path-service.d.ts.map +1 -0
  103. package/dist/unity-gateway/path-service.js +233 -0
  104. package/dist/unity-gateway/path-service.js.map +1 -0
  105. package/dist/unity-gateway/types.d.ts +168 -0
  106. package/dist/unity-gateway/types.d.ts.map +1 -0
  107. package/dist/unity-gateway/types.js +2 -0
  108. package/dist/unity-gateway/types.js.map +1 -0
  109. package/package.json +57 -0
@@ -0,0 +1,140 @@
1
+ import { pathError } from "../canonicalpath/errors.js";
2
+ import { CanonicalPathService } from "./path-service.js";
3
+ export class CanonicalPathBroker {
4
+ paths;
5
+ projects = new Map();
6
+ constructor(paths = new CanonicalPathService()) {
7
+ this.paths = paths;
8
+ }
9
+ registerProject(registration) {
10
+ if (registration.projectId === "")
11
+ throw pathError("ERR_INVALID_PATH", "projectId is required");
12
+ if (registration.projectId.includes("\0"))
13
+ throw pathError("ERR_NUL_BYTE", "projectId contains NUL");
14
+ const record = {
15
+ projectId: registration.projectId,
16
+ canonicalProjectPath: this.paths.normalizeProjectRoot(registration.projectRoot, registration.normalizeOptions),
17
+ normalizeOptions: registration.normalizeOptions,
18
+ hostRoot: registration.hostRoot,
19
+ pathAliases: [],
20
+ };
21
+ if (registration.hostRoot !== undefined) {
22
+ this.addPathAlias(record, {
23
+ clientType: "gateway",
24
+ clientId: "default",
25
+ environmentId: "default",
26
+ hostKind: defaultHostKind(registration.normalizeOptions),
27
+ hostRoot: registration.hostRoot,
28
+ normalizeOptions: registration.normalizeOptions,
29
+ label: "default host root",
30
+ });
31
+ }
32
+ for (const alias of registration.aliases ?? [])
33
+ this.addPathAlias(record, alias);
34
+ this.projects.set(record.projectId, record);
35
+ return record;
36
+ }
37
+ getProject(projectId) {
38
+ const project = this.projects.get(projectId);
39
+ if (!project)
40
+ throw pathError("ERR_INVALID_PATH", `unknown Unity project ${projectId}`);
41
+ return project;
42
+ }
43
+ listProjects() {
44
+ return [...this.projects.values()];
45
+ }
46
+ registerPathAlias(projectId, registration) {
47
+ return this.addPathAlias(this.getProject(projectId), registration);
48
+ }
49
+ addPathAlias(project, registration) {
50
+ const alias = this.createPathAlias(project, registration);
51
+ if (project.pathAliases.some((existing) => pathAliasKey(existing) === pathAliasKey(alias))) {
52
+ throw pathError("ERR_INVALID_PATH", "path alias already exists for project/client/environment");
53
+ }
54
+ project.pathAliases.push(alias);
55
+ return alias;
56
+ }
57
+ listPathAliases(projectId) {
58
+ return [...this.getProject(projectId).pathAliases];
59
+ }
60
+ getPathAlias(projectId, selector) {
61
+ const matches = this.listPathAliases(projectId).filter((alias) => pathAliasMatches(alias, selector));
62
+ if (matches.length === 0)
63
+ throw pathError("ERR_INVALID_PATH", `no path alias for Unity project ${projectId}`);
64
+ if (matches.length > 1)
65
+ throw pathError("ERR_INVALID_PATH", `ambiguous path alias for Unity project ${projectId}`);
66
+ return matches[0];
67
+ }
68
+ resolveHostRoot(projectId, selector = {}) {
69
+ const project = this.getProject(projectId);
70
+ if (Object.keys(selector).length === 0)
71
+ return project.hostRoot ?? (project.pathAliases.length === 1 ? project.pathAliases[0]?.hostRoot : undefined);
72
+ return this.getPathAlias(projectId, selector).hostRoot;
73
+ }
74
+ fromUnityAssetPath(projectId, unityPath) {
75
+ return this.paths.fromUnityAssetPath(this.getProject(projectId).canonicalProjectPath, unityPath);
76
+ }
77
+ toUnityAssetPath(projectId, fullPath) {
78
+ return this.paths.toUnityAssetPath(this.getProject(projectId).canonicalProjectPath, fullPath);
79
+ }
80
+ validateUnityAssetPath(projectId, unityPath, options = {}) {
81
+ const project = this.getProject(projectId);
82
+ const cleanUnityPath = this.paths.normalizeUnityAssetPath(unityPath);
83
+ const result = {
84
+ ok: true,
85
+ projectId,
86
+ unityPath: cleanUnityPath,
87
+ canonicalPath: this.paths.fromUnityAssetPath(project.canonicalProjectPath, cleanUnityPath),
88
+ };
89
+ if (options.generatedFileName !== undefined) {
90
+ result.safeFileName = this.paths.makeSafeFileName(options.generatedFileName, options.maxFileNameLength ?? 128);
91
+ }
92
+ return result;
93
+ }
94
+ createPathAlias(project, registration) {
95
+ assertAliasString(registration.clientType, "clientType");
96
+ assertAliasString(registration.clientId, "clientId");
97
+ assertAliasString(registration.environmentId, "environmentId");
98
+ assertAliasString(registration.hostRoot, "hostRoot");
99
+ const normalizeOptions = registration.normalizeOptions ?? project.normalizeOptions;
100
+ const aliasCanonicalPath = this.paths.normalizeProjectRoot(registration.hostRoot, normalizeOptions);
101
+ if (aliasCanonicalPath !== project.canonicalProjectPath) {
102
+ throw pathError("ERR_INVALID_PATH", "path alias hostRoot does not match canonical project identity");
103
+ }
104
+ return {
105
+ projectId: project.projectId,
106
+ canonicalProjectPath: project.canonicalProjectPath,
107
+ clientType: registration.clientType,
108
+ clientId: registration.clientId,
109
+ environmentId: registration.environmentId,
110
+ hostKind: registration.hostKind ?? defaultHostKind(normalizeOptions),
111
+ hostRoot: registration.hostRoot,
112
+ normalizeOptions,
113
+ label: registration.label,
114
+ };
115
+ }
116
+ }
117
+ function assertAliasString(value, label) {
118
+ if (value === "")
119
+ throw pathError("ERR_INVALID_PATH", `${label} is required`);
120
+ if (value.includes("\0"))
121
+ throw pathError("ERR_NUL_BYTE", `${label} contains NUL`);
122
+ }
123
+ function defaultHostKind(options) {
124
+ return options?.sourceHost ?? "posix";
125
+ }
126
+ function pathAliasKey(alias) {
127
+ return `${alias.clientType}\0${alias.clientId}\0${alias.environmentId}`;
128
+ }
129
+ function pathAliasMatches(alias, selector) {
130
+ if (selector.clientType !== undefined && alias.clientType !== selector.clientType)
131
+ return false;
132
+ if (selector.clientId !== undefined && alias.clientId !== selector.clientId)
133
+ return false;
134
+ if (selector.environmentId !== undefined && alias.environmentId !== selector.environmentId)
135
+ return false;
136
+ if (selector.hostKind !== undefined && alias.hostKind !== selector.hostKind)
137
+ return false;
138
+ return true;
139
+ }
140
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/unity-gateway/broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { CanonicalPathBroker } from "./broker.js";
2
+ import type { UnityBridgeScopedGlobResult, UnityBridgeScopedListResult, UnityBridgeScopedTextResult, UnityBridgeScopedWriteResult, UnityBridgeClient, UnityBridgeLogEntry, UnityBridgePathValidation, UnityBridgeProjectInfo, UnityBridgeReadResult, UnityBridgeStatus, UnityBridgeWriteCommand, UnityBridgeWriteRequest, UnityBridgeWriteResult, UnityPathValidationOptions } from "./types.js";
3
+ import type { UnityMcpWorkflowScope } from "./path-service.js";
4
+ export interface FakeUnityBridgeOptions {
5
+ projectName?: string;
6
+ unityVersion?: string;
7
+ logs?: UnityBridgeLogEntry[];
8
+ files?: Record<string, string>;
9
+ scopedFiles?: Record<string, string>;
10
+ }
11
+ export declare class FakeUnityBridge implements UnityBridgeClient {
12
+ readonly broker: CanonicalPathBroker;
13
+ private readonly options;
14
+ private readonly logs;
15
+ private readonly scopedFiles;
16
+ constructor(broker: CanonicalPathBroker, options?: FakeUnityBridgeOptions);
17
+ status(projectId?: string): Promise<UnityBridgeStatus>;
18
+ projectInfo(projectId: string): Promise<UnityBridgeProjectInfo>;
19
+ readLog(_projectId?: string, maxEntries?: number): Promise<UnityBridgeLogEntry[]>;
20
+ readText(projectId: string, unityPath: string, maxChars?: number): Promise<UnityBridgeReadResult>;
21
+ readScopedText(projectId: string, scope: UnityMcpWorkflowScope, path: string, maxChars?: number): Promise<UnityBridgeScopedTextResult>;
22
+ writeScopedText(projectId: string, scope: UnityMcpWorkflowScope, path: string, text: string, maxChars?: number): Promise<UnityBridgeScopedWriteResult>;
23
+ listScoped(projectId: string, scope: UnityMcpWorkflowScope, pathPrefix?: string, maxEntries?: number): Promise<UnityBridgeScopedListResult>;
24
+ globScoped(projectId: string, scope: UnityMcpWorkflowScope, glob: string, maxEntries?: number): Promise<UnityBridgeScopedGlobResult>;
25
+ validatePath(projectId: string, unityPath: string, options?: UnityPathValidationOptions): Promise<UnityBridgePathValidation>;
26
+ writeCommand(command: UnityBridgeWriteCommand, request: UnityBridgeWriteRequest): Promise<UnityBridgeWriteResult>;
27
+ appendLog(level: UnityBridgeLogEntry["level"], message: string, timestamp?: string): void;
28
+ private resolveWorkflowPath;
29
+ private scopedEntries;
30
+ }
31
+ export declare function fakeUnityFileKey(projectId: string, unityPath: string): string;
32
+ export declare function fakeUnityScopedFileKey(projectId: string, scope: UnityMcpWorkflowScope, path: string): string;
33
+ //# sourceMappingURL=fake-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-bridge.d.ts","sourceRoot":"","sources":["../../src/unity-gateway/fake-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ import { pathError } from "../canonicalpath/errors.js";
2
+ export class FakeUnityBridge {
3
+ broker;
4
+ options;
5
+ logs;
6
+ scopedFiles = new Map();
7
+ constructor(broker, options = {}) {
8
+ this.broker = broker;
9
+ this.options = options;
10
+ this.logs = [...(options.logs ?? [])];
11
+ for (const [key, value] of Object.entries(options.scopedFiles ?? {}))
12
+ this.scopedFiles.set(key, value);
13
+ }
14
+ async status(projectId) {
15
+ return {
16
+ state: "ready",
17
+ projectId,
18
+ projectName: this.options.projectName,
19
+ unityVersion: this.options.unityVersion,
20
+ };
21
+ }
22
+ async projectInfo(projectId) {
23
+ const project = this.broker.getProject(projectId);
24
+ return {
25
+ projectId,
26
+ canonicalProjectPath: project.canonicalProjectPath,
27
+ hostRoot: project.hostRoot,
28
+ pathAliases: project.pathAliases,
29
+ projectName: this.options.projectName,
30
+ unityVersion: this.options.unityVersion,
31
+ };
32
+ }
33
+ async readLog(_projectId, maxEntries = 100) {
34
+ if (!Number.isInteger(maxEntries) || maxEntries < 1)
35
+ return [];
36
+ return this.logs.slice(-maxEntries);
37
+ }
38
+ async readText(projectId, unityPath, maxChars = 1_048_576) {
39
+ if (!Number.isInteger(maxChars) || maxChars < 1)
40
+ throw new Error("maxChars must be a positive integer");
41
+ const validation = this.broker.validateUnityAssetPath(projectId, unityPath);
42
+ const text = this.options.files?.[fileKey(projectId, validation.unityPath)] ?? "";
43
+ const truncated = text.length > maxChars;
44
+ return {
45
+ projectId,
46
+ unityPath: validation.unityPath,
47
+ canonicalPath: validation.canonicalPath,
48
+ text: truncated ? text.slice(0, maxChars) : text,
49
+ truncated,
50
+ };
51
+ }
52
+ async readScopedText(projectId, scope, path, maxChars) {
53
+ const limit = boundedPositiveInteger(maxChars, 65_536, 1_048_576, "maxChars");
54
+ const resolved = this.resolveWorkflowPath(projectId, scope, path);
55
+ const text = this.scopedFiles.get(scopedFileKey(projectId, scope, resolved.path)) ?? "";
56
+ const truncated = text.length > limit;
57
+ return {
58
+ projectId,
59
+ scope,
60
+ path: resolved.path,
61
+ projectRelativePath: resolved.projectRelativePath,
62
+ text: truncated ? text.slice(0, limit) : text,
63
+ truncated,
64
+ artifactRef: artifactRef(scope, resolved.path),
65
+ };
66
+ }
67
+ async writeScopedText(projectId, scope, path, text, maxChars) {
68
+ if (typeof text !== "string")
69
+ throw pathError("ERR_INVALID_PATH", "text must be a string");
70
+ const limit = boundedPositiveInteger(maxChars, 1_048_576, 1_048_576, "maxChars");
71
+ if (text.length > limit)
72
+ throw pathError("ERR_INVALID_PATH", "text exceeds bounded write limit");
73
+ const resolved = this.resolveWorkflowPath(projectId, scope, path);
74
+ this.scopedFiles.set(scopedFileKey(projectId, scope, resolved.path), text);
75
+ return {
76
+ ok: true,
77
+ projectId,
78
+ scope,
79
+ path: resolved.path,
80
+ projectRelativePath: resolved.projectRelativePath,
81
+ chars: text.length,
82
+ artifactRef: artifactRef(scope, resolved.path),
83
+ };
84
+ }
85
+ async listScoped(projectId, scope, pathPrefix, maxEntries) {
86
+ const limit = boundedPositiveInteger(maxEntries, 100, 1000, "maxEntries");
87
+ const prefix = pathPrefix === undefined ? undefined : this.resolveWorkflowPath(projectId, scope, pathPrefix).path;
88
+ const entries = this.scopedEntries(projectId, scope).filter((entry) => prefix === undefined || isUnderPrefix(entry.path, prefix));
89
+ return {
90
+ projectId,
91
+ scope,
92
+ pathPrefix: prefix,
93
+ entries: entries.slice(0, limit),
94
+ truncated: entries.length > limit,
95
+ };
96
+ }
97
+ async globScoped(projectId, scope, glob, maxEntries) {
98
+ this.broker.getProject(projectId);
99
+ const cleanGlob = this.broker.paths.normalizeScopedGlobPattern(scope, glob);
100
+ const limit = boundedPositiveInteger(maxEntries, 100, 1000, "maxEntries");
101
+ const pattern = globToRegExp(cleanGlob);
102
+ const entries = this.scopedEntries(projectId, scope).filter((entry) => pattern.test(entry.path));
103
+ return {
104
+ projectId,
105
+ scope,
106
+ glob: cleanGlob,
107
+ entries: entries.slice(0, limit),
108
+ truncated: entries.length > limit,
109
+ };
110
+ }
111
+ async validatePath(projectId, unityPath, options = {}) {
112
+ return this.broker.validateUnityAssetPath(projectId, unityPath, options);
113
+ }
114
+ async writeCommand(command, request) {
115
+ const dryRun = request.dryRun !== false;
116
+ const validation = request.unityPath === undefined ? undefined : this.broker.validateUnityAssetPath(request.projectId, request.unityPath, { generatedFileName: request.generatedFileName });
117
+ if (requiresUnityPath(command) && validation === undefined)
118
+ throw new Error(`${command} requires unityPath`);
119
+ return {
120
+ ok: true,
121
+ command,
122
+ projectId: request.projectId,
123
+ unityPath: validation?.unityPath,
124
+ canonicalPath: validation?.canonicalPath,
125
+ safeFileName: validation?.safeFileName,
126
+ dryRun,
127
+ performed: false,
128
+ detail: dryRun ? "fake bridge dry-run only" : "fake bridge recorded command only",
129
+ };
130
+ }
131
+ appendLog(level, message, timestamp = new Date(0).toISOString()) {
132
+ this.logs.push({ level, message, timestamp });
133
+ }
134
+ resolveWorkflowPath(projectId, scope, path) {
135
+ this.broker.getProject(projectId);
136
+ if (scope !== "knowledge" && scope !== "artifact")
137
+ throw pathError("ERR_INVALID_PATH", "workflow scope must be knowledge or artifact");
138
+ const resolved = this.broker.paths.normalizeScopedPath(scope, path);
139
+ if (resolved.kind !== "project")
140
+ throw pathError("ERR_INVALID_PATH", "workflow path must be project-backed");
141
+ return { path: path, projectRelativePath: resolved.path };
142
+ }
143
+ scopedEntries(projectId, scope) {
144
+ this.broker.getProject(projectId);
145
+ const prefix = `${projectId}\0${scope}\0`;
146
+ const entries = [];
147
+ for (const [key, text] of this.scopedFiles) {
148
+ if (!key.startsWith(prefix))
149
+ continue;
150
+ const path = key.slice(prefix.length);
151
+ const resolved = this.broker.paths.normalizeScopedPath(scope, path);
152
+ if (resolved.kind !== "project")
153
+ continue;
154
+ entries.push({ scope, path, projectRelativePath: resolved.path, kind: "file", chars: text.length, artifactRef: artifactRef(scope, path) });
155
+ }
156
+ return entries.sort((left, right) => left.path.localeCompare(right.path, undefined, { numeric: true }));
157
+ }
158
+ }
159
+ export function fakeUnityFileKey(projectId, unityPath) {
160
+ return fileKey(projectId, unityPath);
161
+ }
162
+ export function fakeUnityScopedFileKey(projectId, scope, path) {
163
+ return scopedFileKey(projectId, scope, path);
164
+ }
165
+ function fileKey(projectId, unityPath) {
166
+ return `${projectId}:${unityPath}`;
167
+ }
168
+ function scopedFileKey(projectId, scope, path) {
169
+ return `${projectId}\0${scope}\0${path}`;
170
+ }
171
+ function artifactRef(scope, path) {
172
+ return scope === "artifact" ? { scope: "artifact", path } : undefined;
173
+ }
174
+ function boundedPositiveInteger(value, defaultValue, hardCap, label) {
175
+ if (value === undefined)
176
+ return defaultValue;
177
+ if (!Number.isInteger(value) || value < 1)
178
+ throw pathError("ERR_INVALID_PATH", `${label} must be a positive integer`);
179
+ if (value > hardCap)
180
+ throw pathError("ERR_INVALID_PATH", `${label} exceeds hard cap`);
181
+ return value;
182
+ }
183
+ function isUnderPrefix(path, prefix) {
184
+ return path === prefix || path.startsWith(`${prefix}/`);
185
+ }
186
+ function globToRegExp(glob) {
187
+ let pattern = "^";
188
+ for (let i = 0; i < glob.length; i++) {
189
+ const ch = glob[i];
190
+ if (ch === "*") {
191
+ if (glob[i + 1] === "*") {
192
+ pattern += ".*";
193
+ i++;
194
+ }
195
+ else {
196
+ pattern += "[^/]*";
197
+ }
198
+ }
199
+ else if (ch === "?") {
200
+ pattern += "[^/]";
201
+ }
202
+ else {
203
+ pattern += escapeRegExp(ch);
204
+ }
205
+ }
206
+ return new RegExp(`${pattern}$`);
207
+ }
208
+ function escapeRegExp(value) {
209
+ return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
210
+ }
211
+ function requiresUnityPath(command) {
212
+ return command !== "assets.refresh";
213
+ }
214
+ //# sourceMappingURL=fake-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-bridge.js","sourceRoot":"","sources":["../../src/unity-gateway/fake-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./broker.js";
2
+ export * from "./fake-bridge.js";
3
+ export * from "./mcp-tools.js";
4
+ export * from "./path-service.js";
5
+ export * from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unity-gateway/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./broker.js";
2
+ export * from "./fake-bridge.js";
3
+ export * from "./mcp-tools.js";
4
+ export * from "./path-service.js";
5
+ export * from "./types.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/unity-gateway/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { McpToolDescriptor, McpToolResult, UnityBridgeClient } from "./types.js";
2
+ export declare const unityMCPToolNames: readonly ["unity.status", "unity.projectInfo", "unity.readLog", "unity.read", "unity.validatePath", "unity.knowledge.read", "unity.knowledge.write", "unity.knowledge.list", "unity.knowledge.glob", "unity.artifact.read", "unity.artifact.write", "unity.artifact.list", "unity.artifact.glob", "unity.assets.refresh", "unity.scene.save", "unity.asset.import", "unity.prefab.create", "unity.module.create"];
3
+ export type UnityMCPToolName = (typeof unityMCPToolNames)[number];
4
+ export declare class UnityMCPToolRegistry {
5
+ private readonly bridge;
6
+ constructor(bridge: UnityBridgeClient);
7
+ listTools(): McpToolDescriptor[];
8
+ callTool(name: string, args?: unknown): Promise<McpToolResult>;
9
+ private callToolStrict;
10
+ }
11
+ export declare function createUnityMCPTools(bridge: UnityBridgeClient): UnityMCPToolRegistry;
12
+ //# sourceMappingURL=mcp-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.d.ts","sourceRoot":"","sources":["../../src/unity-gateway/mcp-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAgF,MAAM,YAAY,CAAC;AAGpK,eAAO,MAAM,iBAAiB,mZAmBpB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,iBAAiB;IAEtD,SAAS,IAAI,iBAAiB,EAAE;IAI1B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,aAAa,CAAC;YAS1D,cAAc;CA2C7B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,oBAAoB,CAEnF"}