unity-open-mcp 1.4.0 → 1.5.0

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.
@@ -13,7 +13,10 @@ export declare class AssetModelCache {
13
13
  * re-parses.
14
14
  */
15
15
  get(key: string, mtimeMs: number | null): AssetModel | null;
16
- set(key: string, model: AssetModel, mtimeMs: number | null): void;
16
+ /** Re-resolve referenced GUIDs so moved, deleted, and restored dependencies
17
+ * cannot leave a cached model stale while the asset itself is unchanged. */
18
+ getFresh(key: string, mtimeMs: number | null, projectRoot: string, assetPath: string): Promise<AssetModel | null>;
19
+ set(key: string, model: AssetModel, mtimeMs: number | null, dependencies?: Array<[string, string | null]>): void;
17
20
  clear(): void;
18
21
  get size(): number;
19
22
  }
@@ -23,6 +23,7 @@ import { readAssetOffline, isOfflineAsset } from "./offline.js";
23
23
  import { searchAssetsOffline } from "./offline.js";
24
24
  import { makeErrorResult } from "./results.js";
25
25
  import { readProfileAndDetail, applyPaging, attachPagination, isOutputProfile, } from "./output-profile.js";
26
+ import { buildGUIDIndex, safeReadMetaGUID } from "./offline/index-builders.js";
26
27
  import { normalizeAssetPath } from "./offline/paths.js";
27
28
  import { stat } from "node:fs/promises";
28
29
  import { join } from "node:path";
@@ -59,10 +60,28 @@ export class AssetModelCache {
59
60
  this.entries.set(key, entry);
60
61
  return entry.model;
61
62
  }
62
- set(key, model, mtimeMs) {
63
+ /** Re-resolve referenced GUIDs so moved, deleted, and restored dependencies
64
+ * cannot leave a cached model stale while the asset itself is unchanged. */
65
+ async getFresh(key, mtimeMs, projectRoot, assetPath) {
66
+ const model = this.get(key, mtimeMs);
67
+ const entry = this.entries.get(key);
68
+ if (!model || !entry || entry.dependencies === undefined)
69
+ return model;
70
+ const wanted = new Set(entry.dependencies.map(([guid]) => guid));
71
+ const [index, guid] = await Promise.all([
72
+ buildGUIDIndex(projectRoot, wanted),
73
+ safeReadMetaGUID(join(projectRoot, assetPath) + ".meta"),
74
+ ]);
75
+ if ((model.guid ?? "") !== guid || entry.dependencies.some(([id, path]) => (index.get(id) ?? null) !== path)) {
76
+ this.entries.delete(key);
77
+ return null;
78
+ }
79
+ return model;
80
+ }
81
+ set(key, model, mtimeMs, dependencies) {
63
82
  if (this.entries.has(key))
64
83
  this.entries.delete(key);
65
- this.entries.set(key, { model, mtimeMs });
84
+ this.entries.set(key, { model, mtimeMs, dependencies });
66
85
  while (this.entries.size > CACHE_LIMIT) {
67
86
  const oldest = this.entries.keys().next().value;
68
87
  if (oldest === undefined)
@@ -143,11 +162,8 @@ async function routeReadAsset(args, live, cache, projectPath) {
143
162
  }
144
163
  const fieldLimit = typeof args.field_limit === "number" ? args.field_limit : 0;
145
164
  const depth = typeof args.depth === "number" ? args.depth : -1;
146
- // M31-optimizations Plan 4 / T4.3 (M6) — normalize the path so the four
147
- // documented spellings of one file collapse to one cache entry. The
148
- // normalized form is what the cache key is built from; the ORIGINAL
149
- // `assetPath` is still passed to the offline parser / live bridge so
150
- // downstream behavior is byte-identical (only the cache key changes).
165
+ // Use the same normalized path for stat, cache, offline parsing and live
166
+ // fallback so backslash paths work on a cold cache on every platform.
151
167
  const normalizedPath = normalizeAssetPath(assetPath);
152
168
  // mtime invalidation: stat the absolute file once up-front. A failure
153
169
  // (binary-only asset, missing file, permission) yields `null` and the
@@ -156,17 +172,17 @@ async function routeReadAsset(args, live, cache, projectPath) {
156
172
  // now re-parse instead of serving stale until LRU eviction.
157
173
  const mtimeMs = await measureMtimeMs(projectPath, normalizedPath);
158
174
  const cacheKey = `${normalizedPath}|${fieldLimit}|${depth}`;
159
- let model = cache.get(cacheKey, mtimeMs);
175
+ let model = await cache.getFresh(cacheKey, mtimeMs, projectPath, normalizedPath);
160
176
  let cacheHit = true;
161
177
  let source = "offline";
162
178
  if (!model) {
163
179
  cacheHit = false;
164
180
  if (isOfflineAsset(assetPath)) {
165
181
  try {
166
- const result = await readAssetOffline(assetPath, { fieldLimit, projectRoot: projectPath });
182
+ const result = await readAssetOffline(normalizedPath, { fieldLimit, projectRoot: projectPath });
167
183
  model = result.model;
168
184
  source = "offline";
169
- cache.set(cacheKey, model, mtimeMs);
185
+ cache.set(cacheKey, model, mtimeMs, result.dependencies);
170
186
  }
171
187
  catch {
172
188
  // Offline parse failed — fall through to live bridge.
@@ -189,7 +205,7 @@ async function routeReadAsset(args, live, cache, projectPath) {
189
205
  source: "offline",
190
206
  });
191
207
  }
192
- const raw = await live.route("unity_open_mcp_read_asset", args);
208
+ const raw = await live.route("unity_open_mcp_read_asset", { ...args, asset_path: normalizedPath });
193
209
  const parsed = parseContentJson(raw);
194
210
  if (parsed === null) {
195
211
  return raw.isError
@@ -1 +1 @@
1
- {"version":3,"file":"compressible-router.js","sourceRoot":"","sources":["../src/compressible-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compressible-router.js","sourceRoot":"","sources":["../src/compressible-router.ts"],"names":[],"mappings":"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"}
@@ -94,7 +94,7 @@ export declare const COMPILE_STATE_HEADER = "X-Unity-Open-MCP-Compile-State";
94
94
  * verify packages. Mirrors the C# `BridgeConstants.NpmPackage`. Kept in
95
95
  * sync by `scripts/sync-version.mjs`.
96
96
  */
97
- export declare const NPM_PACKAGE = "unity-open-mcp@1.4.0";
97
+ export declare const NPM_PACKAGE = "unity-open-mcp@1.5.0";
98
98
  /**
99
99
  * Build the bridge base URL for a given port. Centralizes the loopback +
100
100
  * scheme so every caller produces the same string.
package/dist/constants.js CHANGED
@@ -105,7 +105,7 @@ export const COMPILE_STATE_HEADER = "X-Unity-Open-MCP-Compile-State";
105
105
  * verify packages. Mirrors the C# `BridgeConstants.NpmPackage`. Kept in
106
106
  * sync by `scripts/sync-version.mjs`.
107
107
  */
108
- export const NPM_PACKAGE = "unity-open-mcp@1.4.0";
108
+ export const NPM_PACKAGE = "unity-open-mcp@1.5.0";
109
109
  /**
110
110
  * Build the bridge base URL for a given port. Centralizes the loopback +
111
111
  * scheme so every caller produces the same string.
@@ -3,36 +3,11 @@ import type { Router } from "./router.js";
3
3
  import { PingCache, type PingSnapshot } from "./ping-cache.js";
4
4
  import type { BridgeToolsInventory } from "./bridge-tools-cache.js";
5
5
  import { type PollAndDismissOptions } from "./dialog-dismiss.js";
6
- /**
7
- * Decide whether {@link LiveClient#postTool}'s catch block should re-POST after
8
- * a transient fetch failure. Exported so the retry policy is unit-testable in
9
- * isolation (driving a real response-timeout through postTool takes 40s because
10
- * the fetch timeout is floored at BRIDGE_DEFAULT_TIMEOUT_MS + slack).
11
- *
12
- * undici (Node's fetch) throws a DISTINGUISHABLE error class for the two
13
- * failure modes that reach this catch:
14
- * - `TypeError` ("fetch failed") → CONNECTION failure: the socket never
15
- * connected, was reset before the request body flushed, or the listen port
16
- * is dead (ECONNREFUSED). No bytes reached the server → no Work was queued
17
- * → no side effect is possible. Re-POSTing is ALWAYS safe, even on an
18
- * unchanged endpoint (the same live bridge never received the first POST).
19
- * - `AbortError` (AbortController timer) → RESPONSE timeout: the request
20
- * connected and the server is still processing it. A side effect may have
21
- * happened or be queued. Re-POSTing is only safe when the endpoint CHANGED
22
- * during recovery (a restart → new bridge that never saw the original POST);
23
- * on an unchanged endpoint the original call may still complete there, so
24
- * re-POSTing would risk running the mutation a second time.
25
- *
26
- * This distinction matters because a burst of parallel /tools/* calls can leave
27
- * a dead/reset connection in the pool: the next POST throws a TypeError on
28
- * connect, and the old "unchanged endpoint → no retry" guard wedged the whole
29
- * typed-editor surface even though the bridge was healthy and idle
30
- * (specs/feedback.md entry 2026-07-02-b). The bug was that the guard conflated
31
- * "endpoint unchanged" with "request in flight," which is only true when the
32
- * fetch actually connected (AbortError), not when it failed to connect
33
- * (TypeError).
6
+ /** Retry only when the transport proves the POST could not reach a listener.
7
+ * A socket reset, response timeout, or a changed endpoint cannot rule out an
8
+ * already committed mutation. Aggregate connect failures must all be safe.
34
9
  */
35
- export declare function shouldRetryPostAfterFailure(err: unknown, endpointChanged: boolean): boolean;
10
+ export declare function shouldRetryPostAfterFailure(err: unknown): boolean;
36
11
  /** `/project-command-jobs` answered without a job snapshot; `status` is its non-OK HTTP status. */
37
12
  export declare class ProjectJobHttpError extends Error {
38
13
  readonly status: number;
@@ -175,15 +150,8 @@ export declare class LiveClient implements Router {
175
150
  * recovers (re-syncing the endpoint, waiting out a reload, or surfacing
176
151
  * the structured offline/dead-bridge error) and re-POSTs only when safe.
177
152
  *
178
- * The retry/compile contract is unchanged from the former monolithic body
179
- * EXCEPT for the recursion bound added in M10 (round-2 review): `attempt`
180
- * counts the POST tries so the postTool → handlePostFailure → postTool loop
181
- * cannot run forever. `shouldRetryPostAfterFailure` returns true for every
182
- * `TypeError`, so if POSTs keep failing at the socket level while `/ping`
183
- * answers during recovery, the previous code re-POSTed the mutation each pass
184
- * with no depth limit. The bound is `this.retry.transientRetryAttempts + 1`
185
- * (1 initial attempt + N retries), matching the documented RETRY_CONFIG
186
- * semantics; once exhausted the offline error is surfaced instead of recursing.
153
+ * The attempt counter caps safe connection retries at one initial POST
154
+ * plus this.retry.transientRetryAttempts. Ambiguous failures never replay.
187
155
  */
188
156
  private postTool;
189
157
  /**
@@ -206,28 +174,7 @@ export declare class LiveClient implements Router {
206
174
  * - unparsable body (bridge_response_unparsable corruption error).
207
175
  */
208
176
  private shapeToolResult;
209
- /**
210
- * Step 3 of {@link postTool}: classify + recover from a transient POST
211
- * failure (ECONNREFUSED / timeout during a domain reload). Re-syncs the cached
212
- * endpoint from the lock first (so a Unity restart self-heals), waits out a
213
- * reload, and re-POSTs ONLY when safe (endpoint changed during recovery, or a
214
- * genuine connection failure where no bytes reached the server).
215
- *
216
- * Re-POST discipline (specs/feedback.md entry 4A — duplicate side-effects):
217
- * when the endpoint is unchanged the same live bridge is still processing —
218
- * or has queued — the original POST's Work; re-POSTing would run the mutation
219
- * a second time. In that case surface the timeout instead of retrying.
220
- *
221
- * M10 (round-2 review) — `attempt` is the 1-based POST attempt counter. When
222
- * it exceeds the configured retry budget (`this.retry.transientRetryAttempts`
223
- * retries beyond the initial attempt) the offline error is surfaced instead
224
- * of recursing. Without this bound `shouldRetryPostAfterFailure` returning
225
- * true for every `TypeError` made the loop unbounded: POSTs failing at the
226
- * socket level while `/ping` answers during recovery re-POSTed the mutation
227
- * each pass forever. The recovery probe inside `handleTransientOffline` is
228
- * itself bounded (`transientRetryAttempts` iterations of `/ping`); this outer
229
- * bound caps how many times we re-enter that recovery + re-POST cycle.
230
- */
177
+ /** Recover connectivity, but replay only proven pre-connection failures. */
231
178
  private handlePostFailure;
232
179
  private ensureReady;
233
180
  /**
@@ -127,44 +127,21 @@ const COMPILE_REPOST_SENTINEL = { __compileRepost: 0 };
127
127
  function isCompileRepostSentinel(v) {
128
128
  return typeof v === "object" && v !== null && "__compileRepost" in v;
129
129
  }
130
- /**
131
- * Decide whether {@link LiveClient#postTool}'s catch block should re-POST after
132
- * a transient fetch failure. Exported so the retry policy is unit-testable in
133
- * isolation (driving a real response-timeout through postTool takes 40s because
134
- * the fetch timeout is floored at BRIDGE_DEFAULT_TIMEOUT_MS + slack).
135
- *
136
- * undici (Node's fetch) throws a DISTINGUISHABLE error class for the two
137
- * failure modes that reach this catch:
138
- * - `TypeError` ("fetch failed") → CONNECTION failure: the socket never
139
- * connected, was reset before the request body flushed, or the listen port
140
- * is dead (ECONNREFUSED). No bytes reached the server → no Work was queued
141
- * → no side effect is possible. Re-POSTing is ALWAYS safe, even on an
142
- * unchanged endpoint (the same live bridge never received the first POST).
143
- * - `AbortError` (AbortController timer) → RESPONSE timeout: the request
144
- * connected and the server is still processing it. A side effect may have
145
- * happened or be queued. Re-POSTing is only safe when the endpoint CHANGED
146
- * during recovery (a restart → new bridge that never saw the original POST);
147
- * on an unchanged endpoint the original call may still complete there, so
148
- * re-POSTing would risk running the mutation a second time.
149
- *
150
- * This distinction matters because a burst of parallel /tools/* calls can leave
151
- * a dead/reset connection in the pool: the next POST throws a TypeError on
152
- * connect, and the old "unchanged endpoint → no retry" guard wedged the whole
153
- * typed-editor surface even though the bridge was healthy and idle
154
- * (specs/feedback.md entry 2026-07-02-b). The bug was that the guard conflated
155
- * "endpoint unchanged" with "request in flight," which is only true when the
156
- * fetch actually connected (AbortError), not when it failed to connect
157
- * (TypeError).
130
+ /** Retry only when the transport proves the POST could not reach a listener.
131
+ * A socket reset, response timeout, or a changed endpoint cannot rule out an
132
+ * already committed mutation. Aggregate connect failures must all be safe.
158
133
  */
159
- export function shouldRetryPostAfterFailure(err, endpointChanged) {
160
- // An endpoint change (Unity restart detected during recovery) always makes a
161
- // retry safe regardless of failure class — the new bridge never saw the POST.
162
- if (endpointChanged)
163
- return true;
164
- // Unchanged endpoint: only retry on a connection failure (TypeError). A
165
- // response timeout (AbortError or anything else) on the same endpoint means
166
- // the request may have reached the bridge → suppress the retry.
167
- return err instanceof TypeError;
134
+ export function shouldRetryPostAfterFailure(err) {
135
+ if (!(err instanceof TypeError))
136
+ return false;
137
+ const isConnectFailure = (cause) => {
138
+ if (cause instanceof AggregateError)
139
+ return cause.errors.length > 0 && cause.errors.every(isConnectFailure);
140
+ if (!cause || typeof cause !== "object" || !("code" in cause))
141
+ return false;
142
+ return ["ECONNREFUSED", "ENOTFOUND", "EAI_AGAIN", "UND_ERR_CONNECT_TIMEOUT"].includes(String(cause.code));
143
+ };
144
+ return isConnectFailure(err.cause);
168
145
  }
169
146
  const OFFLINE_HINT = "Ensure the Unity Editor is open with the Agent Bridge running. " +
170
147
  "The bridge port is per-project (20000 + sha256(projectPath) % 10000), not " +
@@ -781,15 +758,8 @@ export class LiveClient {
781
758
  * recovers (re-syncing the endpoint, waiting out a reload, or surfacing
782
759
  * the structured offline/dead-bridge error) and re-POSTs only when safe.
783
760
  *
784
- * The retry/compile contract is unchanged from the former monolithic body
785
- * EXCEPT for the recursion bound added in M10 (round-2 review): `attempt`
786
- * counts the POST tries so the postTool → handlePostFailure → postTool loop
787
- * cannot run forever. `shouldRetryPostAfterFailure` returns true for every
788
- * `TypeError`, so if POSTs keep failing at the socket level while `/ping`
789
- * answers during recovery, the previous code re-POSTed the mutation each pass
790
- * with no depth limit. The bound is `this.retry.transientRetryAttempts + 1`
791
- * (1 initial attempt + N retries), matching the documented RETRY_CONFIG
792
- * semantics; once exhausted the offline error is surfaced instead of recursing.
761
+ * The attempt counter caps safe connection retries at one initial POST
762
+ * plus this.retry.transientRetryAttempts. Ambiguous failures never replay.
793
763
  */
794
764
  async postTool(toolName, args, retryOn503, attempt = 1, commandLifecycle) {
795
765
  try {
@@ -1163,61 +1133,33 @@ export class LiveClient {
1163
1133
  isError: parsed.error != null,
1164
1134
  };
1165
1135
  }
1166
- /**
1167
- * Step 3 of {@link postTool}: classify + recover from a transient POST
1168
- * failure (ECONNREFUSED / timeout during a domain reload). Re-syncs the cached
1169
- * endpoint from the lock first (so a Unity restart self-heals), waits out a
1170
- * reload, and re-POSTs ONLY when safe (endpoint changed during recovery, or a
1171
- * genuine connection failure where no bytes reached the server).
1172
- *
1173
- * Re-POST discipline (specs/feedback.md entry 4A — duplicate side-effects):
1174
- * when the endpoint is unchanged the same live bridge is still processing —
1175
- * or has queued — the original POST's Work; re-POSTing would run the mutation
1176
- * a second time. In that case surface the timeout instead of retrying.
1177
- *
1178
- * M10 (round-2 review) — `attempt` is the 1-based POST attempt counter. When
1179
- * it exceeds the configured retry budget (`this.retry.transientRetryAttempts`
1180
- * retries beyond the initial attempt) the offline error is surfaced instead
1181
- * of recursing. Without this bound `shouldRetryPostAfterFailure` returning
1182
- * true for every `TypeError` made the loop unbounded: POSTs failing at the
1183
- * socket level while `/ping` answers during recovery re-POSTed the mutation
1184
- * each pass forever. The recovery probe inside `handleTransientOffline` is
1185
- * itself bounded (`transientRetryAttempts` iterations of `/ping`); this outer
1186
- * bound caps how many times we re-enter that recovery + re-POST cycle.
1187
- */
1136
+ /** Recover connectivity, but replay only proven pre-connection failures. */
1188
1137
  async handlePostFailure(toolName, args, err, retryOn503, attempt, commandLifecycle) {
1189
- const endpointBefore = this.baseUrl;
1190
1138
  const recovered = await this.handleTransientOffline("post");
1191
1139
  if (recovered !== null)
1192
1140
  return recovered;
1193
- const endpointChanged = this.baseUrl !== endpointBefore;
1194
1141
  // M10 — bound the postTool → handlePostFailure → postTool recursion. The
1195
1142
  // budget is the initial attempt plus the configured transient retry count.
1196
1143
  const maxAttempts = 1 + this.retry.transientRetryAttempts;
1197
1144
  const attemptsExhausted = attempt >= maxAttempts;
1198
1145
  if (toolName !== "unity_open_mcp_project_commands" &&
1199
1146
  !attemptsExhausted &&
1200
- shouldRetryPostAfterFailure(err, endpointChanged)) {
1147
+ shouldRetryPostAfterFailure(err)) {
1201
1148
  return this.postTool(toolName, args, retryOn503, attempt + 1, commandLifecycle);
1202
1149
  }
1203
1150
  const exhaustedNote = attemptsExhausted
1204
1151
  ? ` The POST retry budget (${maxAttempts} attempt${maxAttempts === 1 ? "" : "s"}) was exhausted after ${attempt} attempt${attempt === 1 ? "" : "s"}; the bridge is reachable by /ping but POSTs keep failing.`
1205
1152
  : "";
1153
+ const ambiguity = shouldRetryPostAfterFailure(err)
1154
+ ? `The connection was refused before the request reached the bridge, so it was not applied.`
1155
+ : `A socket failure, timeout, or endpoint change does not prove the original ` +
1156
+ `operation was not applied; verify its effect before retrying.`;
1157
+ const message = `Tool '${toolName}' did not return a confirmed result. No further POST was sent. ` +
1158
+ `${ambiguity} Endpoint: ${this.baseUrl}.${exhaustedNote}`;
1206
1159
  return makeErrorResult({
1207
1160
  code: "bridge_offline",
1208
- message: `Tool '${toolName}' did not return from the bridge within the client ` +
1209
- `timeout. The bridge endpoint did not change (no restart detected) and ` +
1210
- `the failure was a response timeout (not a connection failure), so ` +
1211
- `the request was NOT retried — re-POSTing would risk running the ` +
1212
- `mutation twice on the same bridge. If the editor was briefly slow ` +
1213
- `(unfocused, GC, a long main-thread op), the original call may still ` +
1214
- `complete there; verify the effect before retrying. Endpoint: ${this.baseUrl}.${exhaustedNote}`,
1215
- detail: {
1216
- error: {
1217
- code: "bridge_offline",
1218
- message: `Client timeout against unchanged endpoint ${this.baseUrl}; not retried to avoid duplicate side-effects.`,
1219
- },
1220
- },
1161
+ message,
1162
+ detail: { error: { code: "bridge_offline", message } },
1221
1163
  });
1222
1164
  }
1223
1165
  async ensureReady() {