unity-mcp-cli 0.71.0 → 0.72.1
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 +31 -0
- package/dist/commands/run-system-tool.d.ts +1 -2
- package/dist/commands/run-system-tool.js +11 -130
- package/dist/commands/run-system-tool.js.map +1 -1
- package/dist/commands/run-tool-builder.d.ts +25 -0
- package/dist/commands/run-tool-builder.js +125 -0
- package/dist/commands/run-tool-builder.js.map +1 -0
- package/dist/commands/run-tool.d.ts +1 -2
- package/dist/commands/run-tool.js +11 -130
- package/dist/commands/run-tool.js.map +1 -1
- package/dist/lib/open.js +6 -0
- package/dist/lib/open.js.map +1 -1
- package/dist/lib/run-tool.d.ts +15 -0
- package/dist/lib/run-tool.js +228 -0
- package/dist/lib/run-tool.js.map +1 -0
- package/dist/lib/types.d.ts +104 -0
- package/dist/lib.d.ts +2 -1
- package/dist/lib.js +1 -0
- package/dist/lib.js.map +1 -1
- package/dist/utils/editor-cache.d.ts +16 -0
- package/dist/utils/editor-cache.js +81 -0
- package/dist/utils/editor-cache.js.map +1 -0
- package/dist/utils/unity-editor.js +15 -0
- package/dist/utils/unity-editor.js.map +1 -1
- package/dist/utils/unity-hub.js +22 -2
- package/dist/utils/unity-hub.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// Library-safe `runTool` / `runSystemTool` implementations.
|
|
2
|
+
//
|
|
3
|
+
// Constraints (same contract as the rest of `lib/*.ts`):
|
|
4
|
+
// - No commander, no spinners, no process.exit, no console output.
|
|
5
|
+
// - Errors are returned in `{ kind: 'failure', success: false, ... }`,
|
|
6
|
+
// never thrown past the public boundary.
|
|
7
|
+
import { readConfig, resolveConnectionFromConfig } from '../utils/config.js';
|
|
8
|
+
import { generatePortFromDirectory } from '../utils/port.js';
|
|
9
|
+
import { requireProjectPath } from './validation.js';
|
|
10
|
+
const DEFAULT_TIMEOUT_MS = 60000;
|
|
11
|
+
/**
|
|
12
|
+
* Invoke a regular MCP tool over the Unity plugin's HTTP API.
|
|
13
|
+
*
|
|
14
|
+
* URL/token resolution priority: explicit override → project config →
|
|
15
|
+
* deterministic localhost port. POSTs to `/api/tools/{name}`. No
|
|
16
|
+
* console output, no `process.exit`; errors are returned in the
|
|
17
|
+
* `kind: 'failure'` variant.
|
|
18
|
+
*/
|
|
19
|
+
export async function runTool(opts) {
|
|
20
|
+
return invokeTool('/api/tools', opts);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Invoke a system tool (internal tool not exposed to MCP clients) over
|
|
24
|
+
* the Unity plugin's HTTP API. POSTs to `/api/system-tools/{name}`.
|
|
25
|
+
*/
|
|
26
|
+
export async function runSystemTool(opts) {
|
|
27
|
+
return invokeTool('/api/system-tools', opts);
|
|
28
|
+
}
|
|
29
|
+
async function invokeTool(routePrefix, opts) {
|
|
30
|
+
const validationFailure = validateOptions(opts);
|
|
31
|
+
if (validationFailure)
|
|
32
|
+
return validationFailure;
|
|
33
|
+
const resolved = resolveConnection(opts);
|
|
34
|
+
if (resolved.kind === 'failure')
|
|
35
|
+
return resolved;
|
|
36
|
+
const { url, token } = resolved;
|
|
37
|
+
const body = serializeInput(opts.input);
|
|
38
|
+
if ('error' in body) {
|
|
39
|
+
return makeFailure({
|
|
40
|
+
endpoint: '',
|
|
41
|
+
reason: 'invalid-input',
|
|
42
|
+
message: body.error.message,
|
|
43
|
+
error: body.error,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const endpoint = `${url}${routePrefix}/${encodeURIComponent(opts.toolName)}`;
|
|
47
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
48
|
+
const timeoutMs = typeof opts.timeoutMs === 'number' && opts.timeoutMs > 0 ? opts.timeoutMs : DEFAULT_TIMEOUT_MS;
|
|
49
|
+
const controller = new AbortController();
|
|
50
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
51
|
+
const externalAbort = () => controller.abort();
|
|
52
|
+
if (opts.signal) {
|
|
53
|
+
if (opts.signal.aborted)
|
|
54
|
+
controller.abort();
|
|
55
|
+
else
|
|
56
|
+
opts.signal.addEventListener('abort', externalAbort, { once: true });
|
|
57
|
+
}
|
|
58
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
59
|
+
if (token)
|
|
60
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
61
|
+
try {
|
|
62
|
+
const response = await fetchImpl(endpoint, {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers,
|
|
65
|
+
body: body.json,
|
|
66
|
+
signal: controller.signal,
|
|
67
|
+
});
|
|
68
|
+
const text = await safeReadText(response);
|
|
69
|
+
const data = parseJsonOrText(text);
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
return makeFailure({
|
|
72
|
+
endpoint,
|
|
73
|
+
reason: 'http-error',
|
|
74
|
+
httpStatus: response.status,
|
|
75
|
+
data,
|
|
76
|
+
message: response.statusText || `HTTP ${response.status}`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const success = {
|
|
80
|
+
kind: 'success',
|
|
81
|
+
success: true,
|
|
82
|
+
endpoint,
|
|
83
|
+
httpStatus: response.status,
|
|
84
|
+
data,
|
|
85
|
+
};
|
|
86
|
+
return success;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return classifyFetchError(err, endpoint, timeoutMs);
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
clearTimeout(timer);
|
|
93
|
+
opts.signal?.removeEventListener('abort', externalAbort);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function validateOptions(opts) {
|
|
97
|
+
if (!opts || typeof opts !== 'object') {
|
|
98
|
+
return makeFailure({
|
|
99
|
+
endpoint: '',
|
|
100
|
+
reason: 'invalid-input',
|
|
101
|
+
message: 'options object is required.',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (typeof opts.toolName !== 'string' || opts.toolName.trim().length === 0) {
|
|
105
|
+
return makeFailure({
|
|
106
|
+
endpoint: '',
|
|
107
|
+
reason: 'invalid-input',
|
|
108
|
+
message: 'toolName is required and must be a non-empty string.',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
const hasUrl = typeof opts.url === 'string' && opts.url.length > 0;
|
|
112
|
+
const hasProjectPath = typeof opts.unityProjectPath === 'string' && opts.unityProjectPath.trim().length > 0;
|
|
113
|
+
if (!hasUrl && !hasProjectPath) {
|
|
114
|
+
return makeFailure({
|
|
115
|
+
endpoint: '',
|
|
116
|
+
reason: 'invalid-input',
|
|
117
|
+
message: 'Either unityProjectPath or url must be provided.',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function resolveConnection(opts) {
|
|
123
|
+
if (opts.url) {
|
|
124
|
+
return { kind: 'success', url: opts.url.replace(/\/$/, ''), token: opts.token };
|
|
125
|
+
}
|
|
126
|
+
// `unityProjectPath` is library-only — does NOT require an `Assets/`
|
|
127
|
+
// folder, unlike the CLI's `resolveAndValidateProjectPath`. The
|
|
128
|
+
// deterministic-port fallback works against the path string alone.
|
|
129
|
+
const validated = requireProjectPath(opts.unityProjectPath);
|
|
130
|
+
if (!validated.ok) {
|
|
131
|
+
return makeFailure({
|
|
132
|
+
endpoint: '',
|
|
133
|
+
reason: 'invalid-input',
|
|
134
|
+
message: validated.error.message,
|
|
135
|
+
error: validated.error,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const projectPath = validated.projectPath;
|
|
139
|
+
const config = readConfig(projectPath);
|
|
140
|
+
const fromConfig = config
|
|
141
|
+
? resolveConnectionFromConfig(config)
|
|
142
|
+
: { url: undefined, token: undefined };
|
|
143
|
+
const url = fromConfig.url
|
|
144
|
+
? fromConfig.url.replace(/\/$/, '')
|
|
145
|
+
: `http://localhost:${generatePortFromDirectory(projectPath)}`;
|
|
146
|
+
return { kind: 'success', url, token: opts.token ?? fromConfig.token };
|
|
147
|
+
}
|
|
148
|
+
function serializeInput(input) {
|
|
149
|
+
if (input === undefined || input === null)
|
|
150
|
+
return { json: '{}' };
|
|
151
|
+
if (typeof input === 'string') {
|
|
152
|
+
// Validate the round-trip so the server never sees malformed bodies.
|
|
153
|
+
try {
|
|
154
|
+
JSON.parse(input);
|
|
155
|
+
return { json: input };
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
return {
|
|
159
|
+
error: new Error(`input string is not valid JSON: ${err instanceof Error ? err.message : String(err)}`),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (typeof input !== 'object') {
|
|
164
|
+
return {
|
|
165
|
+
error: new Error('input must be a plain object, JSON string, undefined, or null.'),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
return { json: JSON.stringify(input) };
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return {
|
|
173
|
+
error: new Error(`input could not be serialized to JSON: ${err instanceof Error ? err.message : String(err)}`),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function safeReadText(response) {
|
|
178
|
+
try {
|
|
179
|
+
return await response.text();
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return '';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function parseJsonOrText(text) {
|
|
186
|
+
if (text.length === 0)
|
|
187
|
+
return undefined;
|
|
188
|
+
try {
|
|
189
|
+
return JSON.parse(text);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return text;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function getCause(err) {
|
|
196
|
+
if (!(err instanceof Error) || !('cause' in err))
|
|
197
|
+
return undefined;
|
|
198
|
+
return err.cause;
|
|
199
|
+
}
|
|
200
|
+
function classifyFetchError(err, endpoint, timeoutMs) {
|
|
201
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
202
|
+
return makeFailure({
|
|
203
|
+
endpoint,
|
|
204
|
+
reason: 'timeout',
|
|
205
|
+
message: `Tool call timed out after ${timeoutMs}ms.`,
|
|
206
|
+
error: err,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
210
|
+
const causeCode = getCause(err)?.code;
|
|
211
|
+
let reason = 'unknown';
|
|
212
|
+
if (causeCode === 'ECONNREFUSED')
|
|
213
|
+
reason = 'connection-refused';
|
|
214
|
+
else if (causeCode === 'ECONNRESET')
|
|
215
|
+
reason = 'connection-reset';
|
|
216
|
+
else if (causeCode === 'ENOTFOUND' || causeCode === 'EAI_AGAIN')
|
|
217
|
+
reason = 'network-error';
|
|
218
|
+
return makeFailure({
|
|
219
|
+
endpoint,
|
|
220
|
+
reason,
|
|
221
|
+
message: error.message,
|
|
222
|
+
error,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
function makeFailure(fields) {
|
|
226
|
+
return { kind: 'failure', success: false, ...fields };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=run-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/lib/run-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -376,3 +376,107 @@ export interface OpenEnvInputs {
|
|
|
376
376
|
transport?: OpenProjectOptions['transport'];
|
|
377
377
|
startServer?: OpenProjectOptions['startServer'];
|
|
378
378
|
}
|
|
379
|
+
/**
|
|
380
|
+
* Coarse failure category for {@link RunToolFailure}. Mirrors the
|
|
381
|
+
* branches the CLI's `run-tool` command surfaces in its error path so
|
|
382
|
+
* library consumers can render the same diagnostics without re-deriving
|
|
383
|
+
* them from the underlying `Error`.
|
|
384
|
+
*/
|
|
385
|
+
export type RunToolFailureReason = 'invalid-input' | 'connection-refused' | 'connection-reset' | 'network-error' | 'timeout' | 'http-error' | 'unknown';
|
|
386
|
+
/**
|
|
387
|
+
* Options accepted by both {@link runTool} and {@link runSystemTool}.
|
|
388
|
+
*
|
|
389
|
+
* Either `unityProjectPath` (preferred — resolves URL + token from the
|
|
390
|
+
* project's `UserSettings/AI-Game-Developer-Config.json`, falling back
|
|
391
|
+
* to a deterministic localhost port when the file is absent) or `url`
|
|
392
|
+
* (explicit endpoint override) MUST be provided.
|
|
393
|
+
*/
|
|
394
|
+
export interface RunToolOptions {
|
|
395
|
+
/**
|
|
396
|
+
* Tool name to invoke. Forwarded as the `{name}` segment of the
|
|
397
|
+
* route — the function URL-encodes it before issuing the request.
|
|
398
|
+
*/
|
|
399
|
+
toolName: string;
|
|
400
|
+
/**
|
|
401
|
+
* Absolute or relative path to the Unity project. Used to read the
|
|
402
|
+
* project's config (host + token) and, as a last resort, to derive
|
|
403
|
+
* the deterministic localhost port mirroring the C# plugin's hash.
|
|
404
|
+
*/
|
|
405
|
+
unityProjectPath?: string;
|
|
406
|
+
/** Explicit base URL override (no trailing slash required). */
|
|
407
|
+
url?: string;
|
|
408
|
+
/** Bearer token override. */
|
|
409
|
+
token?: string;
|
|
410
|
+
/**
|
|
411
|
+
* Tool arguments, serialized as the JSON request body. When omitted,
|
|
412
|
+
* the body is `{}`. Anything other than `undefined` / `null` /
|
|
413
|
+
* `object` is rejected with a `kind: 'failure'` result.
|
|
414
|
+
*/
|
|
415
|
+
input?: unknown;
|
|
416
|
+
/**
|
|
417
|
+
* Per-request timeout in milliseconds. Defaults to `60000` (matching
|
|
418
|
+
* the CLI command's `--timeout` default). Values <= 0 are treated as
|
|
419
|
+
* the default to keep accidental "0 = disable" mistakes from
|
|
420
|
+
* stalling polling callers.
|
|
421
|
+
*/
|
|
422
|
+
timeoutMs?: number;
|
|
423
|
+
/**
|
|
424
|
+
* Optional abort signal. When fired, the in-flight fetch is
|
|
425
|
+
* cancelled and the result resolves to a `kind: 'failure'` with
|
|
426
|
+
* `reason: 'timeout'`.
|
|
427
|
+
*/
|
|
428
|
+
signal?: AbortSignal;
|
|
429
|
+
/**
|
|
430
|
+
* Optional injection point so tests can swap the `fetch`
|
|
431
|
+
* implementation. Defaults to the global `fetch`.
|
|
432
|
+
*/
|
|
433
|
+
fetchImpl?: typeof fetch;
|
|
434
|
+
}
|
|
435
|
+
/** Successful `runTool` / `runSystemTool` outcome. Narrow with `kind === 'success'`. */
|
|
436
|
+
export interface RunToolSuccess {
|
|
437
|
+
kind: 'success';
|
|
438
|
+
/** Always `true` for the success variant. Wire-compatible alias for `kind === 'success'`. */
|
|
439
|
+
success: true;
|
|
440
|
+
/** Resolved endpoint URL that was hit (post URL/token resolution). */
|
|
441
|
+
endpoint: string;
|
|
442
|
+
/** HTTP status code returned by the Unity plugin. */
|
|
443
|
+
httpStatus: number;
|
|
444
|
+
/**
|
|
445
|
+
* Parsed response body. The Unity plugin returns
|
|
446
|
+
* `{ status: "success", structured?: <tool output>, content?: <text blocks[]> }`
|
|
447
|
+
* — consumers typically read `data.structured` or `data.content`
|
|
448
|
+
* depending on whether the invoked tool returns structured content.
|
|
449
|
+
* Non-JSON responses surface the raw text string.
|
|
450
|
+
*/
|
|
451
|
+
data: unknown;
|
|
452
|
+
}
|
|
453
|
+
/** Failed `runTool` / `runSystemTool` outcome. Narrow with `kind === 'failure'`. */
|
|
454
|
+
export interface RunToolFailure {
|
|
455
|
+
kind: 'failure';
|
|
456
|
+
/** Always `false` for the failure variant. Wire-compatible alias for `kind === 'failure'`. */
|
|
457
|
+
success: false;
|
|
458
|
+
/**
|
|
459
|
+
* Resolved endpoint URL. Empty string when the failure is
|
|
460
|
+
* `reason: 'invalid-input'` and resolution never happened.
|
|
461
|
+
*/
|
|
462
|
+
endpoint: string;
|
|
463
|
+
/** Coarse cause — see {@link RunToolFailureReason}. */
|
|
464
|
+
reason: RunToolFailureReason;
|
|
465
|
+
/** HTTP status code when `reason === 'http-error'`. */
|
|
466
|
+
httpStatus?: number;
|
|
467
|
+
/**
|
|
468
|
+
* Response body for diagnostics on `http-error` (parsed JSON when the
|
|
469
|
+
* server returned JSON, otherwise the raw text). Omitted on transport
|
|
470
|
+
* failures where no response was received.
|
|
471
|
+
*/
|
|
472
|
+
data?: unknown;
|
|
473
|
+
/** Human-readable failure summary; never thrown past the public boundary. */
|
|
474
|
+
message: string;
|
|
475
|
+
/** Captured error, when applicable. */
|
|
476
|
+
error?: Error;
|
|
477
|
+
}
|
|
478
|
+
export type RunToolResult = RunToolSuccess | RunToolFailure;
|
|
479
|
+
export type RunSystemToolOptions = RunToolOptions;
|
|
480
|
+
export type RunSystemToolResult = RunToolResult;
|
|
481
|
+
export type RunSystemToolSuccess = RunToolSuccess;
|
|
482
|
+
export type RunSystemToolFailure = RunToolFailure;
|
package/dist/lib.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export { removePlugin } from './lib/remove-plugin.js';
|
|
|
3
3
|
export { configure } from './lib/configure.js';
|
|
4
4
|
export { setupMcp, listAgentIds } from './lib/setup-mcp.js';
|
|
5
5
|
export { openProject } from './lib/open.js';
|
|
6
|
-
export
|
|
6
|
+
export { runTool, runSystemTool } from './lib/run-tool.js';
|
|
7
|
+
export type { ProgressEvent, ProgressCallback, ResultKind, InstallPluginOptions, InstallResult, InstallSuccess, InstallFailure, RemovePluginOptions, RemoveResult, RemoveSuccess, RemoveFailure, ConfigureOptions, ConfigureResult, ConfigureSuccess, ConfigureFailure, ConfigureSnapshot, FeatureAction, McpFeatureSnapshot, SetupMcpOptions, SetupMcpResult, SetupMcpSuccess, SetupMcpFailure, McpTransport, OpenProjectOptions, OpenProjectResult, OpenProjectSuccess, OpenProjectFailure, OpenProjectAuthOption, OpenProjectTransport, RunToolOptions, RunToolResult, RunToolSuccess, RunToolFailure, RunToolFailureReason, RunSystemToolOptions, RunSystemToolResult, RunSystemToolSuccess, RunSystemToolFailure, } from './lib/types.js';
|
package/dist/lib.js
CHANGED
|
@@ -20,4 +20,5 @@ export { removePlugin } from './lib/remove-plugin.js';
|
|
|
20
20
|
export { configure } from './lib/configure.js';
|
|
21
21
|
export { setupMcp, listAgentIds } from './lib/setup-mcp.js';
|
|
22
22
|
export { openProject } from './lib/open.js';
|
|
23
|
+
export { runTool, runSystemTool } from './lib/run-tool.js';
|
|
23
24
|
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,qDAAqD;AACrD,iEAAiE;AACjE,sEAAsE;AACtE,oDAAoD;AACpD,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,iEAAiE;AACjE,oEAAoE;AACpE,2BAA2B;AAC3B,EAAE;AACF,sEAAsE;AACtE,sDAAsD;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,qDAAqD;AACrD,iEAAiE;AACjE,sEAAsE;AACtE,oDAAoD;AACpD,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,iEAAiE;AACjE,oEAAoE;AACpE,2BAA2B;AAC3B,EAAE;AACF,sEAAsE;AACtE,sDAAsD;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Look up a previously-resolved editor binary path for the given
|
|
3
|
+
* Unity version (or `undefined` to look up the "auto / highest" slot).
|
|
4
|
+
* Returns null when no entry exists OR when the cached path no longer
|
|
5
|
+
* exists on disk — in the latter case the stale entry is dropped
|
|
6
|
+
* automatically so subsequent reads don't waste a stat call.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readCachedEditorPath(version: string | undefined): string | null;
|
|
9
|
+
/** Save the resolved editor path under the given version key. */
|
|
10
|
+
export declare function writeCachedEditorPath(version: string | undefined, editorPath: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Drop the cache entry for the given version. Called when a cached
|
|
13
|
+
* path turned out to be unusable (e.g. spawn failed) so the next
|
|
14
|
+
* invocation re-runs the full resolution.
|
|
15
|
+
*/
|
|
16
|
+
export declare function clearCachedEditorPath(version: string | undefined): void;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
4
|
+
import { verbose } from './ui.js';
|
|
5
|
+
const CACHE_FILE = join(homedir(), '.unity-mcp-cli-editor-cache.json');
|
|
6
|
+
// Storage key for the version-less "highest installed" lookup.
|
|
7
|
+
// Underscored to stay out of the Unity-version namespace (e.g. `6000.3.1f1`).
|
|
8
|
+
const AUTO_KEY = '__auto__';
|
|
9
|
+
function keyFor(version) {
|
|
10
|
+
return version ?? AUTO_KEY;
|
|
11
|
+
}
|
|
12
|
+
function readAll() {
|
|
13
|
+
try {
|
|
14
|
+
const raw = readFileSync(CACHE_FILE, 'utf-8');
|
|
15
|
+
const parsed = JSON.parse(raw);
|
|
16
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
17
|
+
const safe = Object.create(null);
|
|
18
|
+
for (const k of Object.keys(parsed)) {
|
|
19
|
+
safe[k] = parsed[k];
|
|
20
|
+
}
|
|
21
|
+
return safe;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Missing or corrupt — treat as empty cache.
|
|
26
|
+
}
|
|
27
|
+
return Object.create(null);
|
|
28
|
+
}
|
|
29
|
+
function writeAll(cache) {
|
|
30
|
+
try {
|
|
31
|
+
writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2), 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Best-effort: a read-only home dir or full disk should never break `open`.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Look up a previously-resolved editor binary path for the given
|
|
39
|
+
* Unity version (or `undefined` to look up the "auto / highest" slot).
|
|
40
|
+
* Returns null when no entry exists OR when the cached path no longer
|
|
41
|
+
* exists on disk — in the latter case the stale entry is dropped
|
|
42
|
+
* automatically so subsequent reads don't waste a stat call.
|
|
43
|
+
*/
|
|
44
|
+
export function readCachedEditorPath(version) {
|
|
45
|
+
const cache = readAll();
|
|
46
|
+
const k = keyFor(version);
|
|
47
|
+
const entry = cache[k];
|
|
48
|
+
if (!entry || typeof entry.path !== 'string')
|
|
49
|
+
return null;
|
|
50
|
+
if (!existsSync(entry.path)) {
|
|
51
|
+
verbose(`editor-cache: stale entry for ${k} -> ${entry.path} (file missing), evicting`);
|
|
52
|
+
delete cache[k];
|
|
53
|
+
writeAll(cache);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
verbose(`editor-cache: hit ${k} -> ${entry.path}`);
|
|
57
|
+
return entry.path;
|
|
58
|
+
}
|
|
59
|
+
/** Save the resolved editor path under the given version key. */
|
|
60
|
+
export function writeCachedEditorPath(version, editorPath) {
|
|
61
|
+
const cache = readAll();
|
|
62
|
+
const k = keyFor(version);
|
|
63
|
+
cache[k] = { path: editorPath, savedAt: Date.now() };
|
|
64
|
+
writeAll(cache);
|
|
65
|
+
verbose(`editor-cache: stored ${k} -> ${editorPath}`);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Drop the cache entry for the given version. Called when a cached
|
|
69
|
+
* path turned out to be unusable (e.g. spawn failed) so the next
|
|
70
|
+
* invocation re-runs the full resolution.
|
|
71
|
+
*/
|
|
72
|
+
export function clearCachedEditorPath(version) {
|
|
73
|
+
const cache = readAll();
|
|
74
|
+
const k = keyFor(version);
|
|
75
|
+
if (cache[k] === undefined)
|
|
76
|
+
return;
|
|
77
|
+
delete cache[k];
|
|
78
|
+
writeAll(cache);
|
|
79
|
+
verbose(`editor-cache: cleared ${k}`);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=editor-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-cache.js","sourceRoot":"","sources":["../../src/utils/editor-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,kCAAkC,CAAC,CAAC;AAEvE,+DAA+D;AAC/D,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,UAAU,CAAC;AAW5B,SAAS,MAAM,CAAC,OAA2B;IACzC,OAAO,OAAO,IAAI,QAAQ,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO;IACd,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,GAAgB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAgB,CAAC;YAC7D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAgB,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,CAAC,CAAC,GAAI,MAAsB,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAgB,CAAC;AAC5C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAkB;IAClC,IAAI,CAAC;QACH,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC9D,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,iCAAiC,CAAC,OAAO,KAAK,CAAC,IAAI,2BAA2B,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,qBAAqB,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,qBAAqB,CAAC,OAA2B,EAAE,UAAkB;IACnF,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChB,OAAO,CAAC,wBAAwB,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA2B;IAC/D,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChB,OAAO,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -3,6 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import { spawn } from 'child_process';
|
|
4
4
|
import { platform } from 'os';
|
|
5
5
|
import { findUnityHub, ensureUnityHub, listInstalledEditors } from './unity-hub.js';
|
|
6
|
+
import { readCachedEditorPath, writeCachedEditorPath } from './editor-cache.js';
|
|
6
7
|
import * as ui from './ui.js';
|
|
7
8
|
import { verbose } from './ui.js';
|
|
8
9
|
/**
|
|
@@ -68,12 +69,20 @@ export function getProjectEditorVersion(projectPath) {
|
|
|
68
69
|
export async function findEditorPath(version) {
|
|
69
70
|
const startedAt = Date.now();
|
|
70
71
|
verbose(`findEditorPath start (version=${version ?? 'auto'})`);
|
|
72
|
+
// Cache hit short-circuits the Unity Hub Electron probe below
|
|
73
|
+
// (~13s cold -> ~instant warm). Stale entries self-evict.
|
|
74
|
+
const cached = readCachedEditorPath(version);
|
|
75
|
+
if (cached) {
|
|
76
|
+
verbose(`findEditorPath cache hit in ${Date.now() - startedAt}ms`);
|
|
77
|
+
return cached;
|
|
78
|
+
}
|
|
71
79
|
// Fast path: if we know the version, check common install locations first (instant filesystem check)
|
|
72
80
|
if (version) {
|
|
73
81
|
const fastStartedAt = Date.now();
|
|
74
82
|
const fastResult = findEditorPathByCommonLocations(version);
|
|
75
83
|
verbose(`findEditorPath fast path completed in ${Date.now() - fastStartedAt}ms (${fastResult ? 'hit' : 'miss'})`);
|
|
76
84
|
if (fastResult) {
|
|
85
|
+
writeCachedEditorPath(version, fastResult);
|
|
77
86
|
verbose(`findEditorPath resolved via common locations in ${Date.now() - startedAt}ms`);
|
|
78
87
|
return fastResult;
|
|
79
88
|
}
|
|
@@ -87,6 +96,8 @@ export async function findEditorPath(version) {
|
|
|
87
96
|
const fallback = findEditorPathByCommonLocations(version);
|
|
88
97
|
verbose(`findEditorPath fallback common-location scan completed in ${Date.now() - fallbackStartedAt}ms (${fallback ? 'hit' : 'miss'})`);
|
|
89
98
|
verbose(`findEditorPath completed in ${Date.now() - startedAt}ms`);
|
|
99
|
+
if (fallback)
|
|
100
|
+
writeCachedEditorPath(version, fallback);
|
|
90
101
|
return fallback;
|
|
91
102
|
}
|
|
92
103
|
const listStartedAt = Date.now();
|
|
@@ -97,12 +108,15 @@ export async function findEditorPath(version) {
|
|
|
97
108
|
const fallback = findEditorPathByCommonLocations(version);
|
|
98
109
|
verbose(`findEditorPath empty-editor fallback completed in ${Date.now() - fallbackStartedAt}ms (${fallback ? 'hit' : 'miss'})`);
|
|
99
110
|
verbose(`findEditorPath completed in ${Date.now() - startedAt}ms`);
|
|
111
|
+
if (fallback)
|
|
112
|
+
writeCachedEditorPath(version, fallback);
|
|
100
113
|
return fallback;
|
|
101
114
|
}
|
|
102
115
|
if (version) {
|
|
103
116
|
const match = editors.find((e) => e.version === version);
|
|
104
117
|
if (match) {
|
|
105
118
|
const resolved = getEditorBinary(match.path);
|
|
119
|
+
writeCachedEditorPath(version, resolved);
|
|
106
120
|
verbose(`findEditorPath matched requested version ${version} in ${Date.now() - startedAt}ms`);
|
|
107
121
|
return resolved;
|
|
108
122
|
}
|
|
@@ -110,6 +124,7 @@ export async function findEditorPath(version) {
|
|
|
110
124
|
// Return the highest installed editor by version-aware sorting
|
|
111
125
|
const sorted = [...editors].sort((a, b) => compareUnityVersions(b.version, a.version));
|
|
112
126
|
const resolved = getEditorBinary(sorted[0].path);
|
|
127
|
+
writeCachedEditorPath(version, resolved);
|
|
113
128
|
verbose(`findEditorPath selected highest installed version ${sorted[0].version} in ${Date.now() - startedAt}ms`);
|
|
114
129
|
return resolved;
|
|
115
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unity-editor.js","sourceRoot":"","sources":["../../src/utils/unity-editor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"unity-editor.js","sourceRoot":"","sources":["../../src/utils/unity-editor.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/unity-hub.js
CHANGED
|
@@ -182,6 +182,19 @@ export async function ensureUnityHub() {
|
|
|
182
182
|
verbose(`ensureUnityHub installed Unity Hub in ${Date.now() - startedAt}ms`);
|
|
183
183
|
return installedHubPath;
|
|
184
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Pull the `stderr` capture off an `execFileSync` error and merge it
|
|
187
|
+
* into the error message. Returns the bare `err.message` when no
|
|
188
|
+
* stderr was captured (e.g. spawn failures before the child ran).
|
|
189
|
+
*/
|
|
190
|
+
function formatExecError(err) {
|
|
191
|
+
const message = err.message;
|
|
192
|
+
const stderr = err.stderr;
|
|
193
|
+
if (!stderr)
|
|
194
|
+
return message;
|
|
195
|
+
const text = (Buffer.isBuffer(stderr) ? stderr.toString('utf-8') : stderr).trim();
|
|
196
|
+
return text ? `${message}\n${text}` : message;
|
|
197
|
+
}
|
|
185
198
|
/**
|
|
186
199
|
* List installed Unity editors via Unity Hub CLI.
|
|
187
200
|
*/
|
|
@@ -209,9 +222,14 @@ export function listInstalledEditors(hubPath) {
|
|
|
209
222
|
try {
|
|
210
223
|
verbose(`listInstalledEditors invoking Unity Hub CLI: ${hubPath} -- --headless editors --installed`);
|
|
211
224
|
const execStartedAt = Date.now();
|
|
225
|
+
// stdio: pipe stderr instead of inheriting it — Unity Hub is an
|
|
226
|
+
// Electron app and Chromium routinely logs benign quota_database
|
|
227
|
+
// errors to stderr that would otherwise pollute the CLI output.
|
|
228
|
+
// The catch block re-surfaces captured stderr on real failures.
|
|
212
229
|
const output = execFileSync(hubPath, ['--', '--headless', 'editors', '--installed'], {
|
|
213
230
|
encoding: 'utf-8',
|
|
214
231
|
timeout: 120000,
|
|
232
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
215
233
|
});
|
|
216
234
|
verbose(`listInstalledEditors Unity Hub CLI returned in ${Date.now() - execStartedAt}ms`);
|
|
217
235
|
const parseStartedAt = Date.now();
|
|
@@ -228,7 +246,7 @@ export function listInstalledEditors(hubPath) {
|
|
|
228
246
|
return editors;
|
|
229
247
|
}
|
|
230
248
|
catch (err) {
|
|
231
|
-
spinner.error(`Failed to list installed editors: ${err
|
|
249
|
+
spinner.error(`Failed to list installed editors: ${formatExecError(err)}`);
|
|
232
250
|
verbose(`listInstalledEditors failed after ${Date.now() - startedAt}ms`);
|
|
233
251
|
return [];
|
|
234
252
|
}
|
|
@@ -273,9 +291,11 @@ export function findHighestEditor(editors) {
|
|
|
273
291
|
export function listAvailableReleases(hubPath) {
|
|
274
292
|
const spinner = ui.startSpinner('Fetching available releases...');
|
|
275
293
|
try {
|
|
294
|
+
// Same stderr suppression rationale as listInstalledEditors above.
|
|
276
295
|
const output = execFileSync(hubPath, ['--', '--headless', 'editors', '--releases'], {
|
|
277
296
|
encoding: 'utf-8',
|
|
278
297
|
timeout: 120000,
|
|
298
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
279
299
|
});
|
|
280
300
|
const releases = [];
|
|
281
301
|
for (const line of output.split('\n')) {
|
|
@@ -294,7 +314,7 @@ export function listAvailableReleases(hubPath) {
|
|
|
294
314
|
return releases;
|
|
295
315
|
}
|
|
296
316
|
catch (err) {
|
|
297
|
-
spinner.error(`Failed to fetch available releases: ${err
|
|
317
|
+
spinner.error(`Failed to fetch available releases: ${formatExecError(err)}`);
|
|
298
318
|
return [];
|
|
299
319
|
}
|
|
300
320
|
}
|