unity-open-mcp 1.4.0 → 1.6.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.
Files changed (102) hide show
  1. package/dist/capabilities/cost-hints.js +73 -0
  2. package/dist/capabilities/cost-hints.js.map +1 -1
  3. package/dist/capabilities/intent-groups.js +76 -4
  4. package/dist/capabilities/intent-groups.js.map +1 -1
  5. package/dist/capabilities/lifecycle.js +9 -0
  6. package/dist/capabilities/lifecycle.js.map +1 -1
  7. package/dist/capabilities/tool-groups.js +75 -17
  8. package/dist/capabilities/tool-groups.js.map +1 -1
  9. package/dist/compressible-router.d.ts +4 -1
  10. package/dist/compressible-router.js +27 -11
  11. package/dist/compressible-router.js.map +1 -1
  12. package/dist/constants.d.ts +2 -2
  13. package/dist/constants.js +2 -2
  14. package/dist/event-stream.d.ts +10 -0
  15. package/dist/event-stream.js +29 -0
  16. package/dist/event-stream.js.map +1 -1
  17. package/dist/game-view-settle.d.ts +18 -0
  18. package/dist/game-view-settle.js +81 -0
  19. package/dist/game-view-settle.js.map +1 -0
  20. package/dist/jobs/adapters.d.ts +59 -0
  21. package/dist/jobs/adapters.js +226 -0
  22. package/dist/jobs/adapters.js.map +1 -1
  23. package/dist/live-client.d.ts +17 -60
  24. package/dist/live-client.js +52 -87
  25. package/dist/live-client.js.map +1 -1
  26. package/dist/local-tools.js +3 -0
  27. package/dist/local-tools.js.map +1 -1
  28. package/dist/offline/api.d.ts +2 -0
  29. package/dist/offline/api.js +4 -2
  30. package/dist/offline/api.js.map +1 -1
  31. package/dist/offline/model.js +1 -1
  32. package/dist/offline/model.js.map +1 -1
  33. package/dist/offline/parse.d.ts +1 -1
  34. package/dist/offline/parse.js +20 -8
  35. package/dist/offline/parse.js.map +1 -1
  36. package/dist/playmode-routes.d.ts +17 -0
  37. package/dist/playmode-routes.js +50 -0
  38. package/dist/playmode-routes.js.map +1 -0
  39. package/dist/playtest/png.d.ts +27 -0
  40. package/dist/playtest/png.js +248 -0
  41. package/dist/playtest/png.js.map +1 -0
  42. package/dist/playtest/recorder.d.ts +203 -0
  43. package/dist/playtest/recorder.js +945 -0
  44. package/dist/playtest/recorder.js.map +1 -0
  45. package/dist/playtest/redact.d.ts +16 -0
  46. package/dist/playtest/redact.js +124 -0
  47. package/dist/playtest/redact.js.map +1 -0
  48. package/dist/playtest/report.d.ts +73 -0
  49. package/dist/playtest/report.js +477 -0
  50. package/dist/playtest/report.js.map +1 -0
  51. package/dist/playtest/session-store.d.ts +78 -0
  52. package/dist/playtest/session-store.js +224 -0
  53. package/dist/playtest/session-store.js.map +1 -0
  54. package/dist/skill/SKILL.md +22 -3
  55. package/dist/skill/references/senses-and-tests.md +3 -0
  56. package/dist/skill/references/yaml-and-offline-work.md +1 -1
  57. package/dist/tool-router.d.ts +44 -0
  58. package/dist/tool-router.js +249 -7
  59. package/dist/tool-router.js.map +1 -1
  60. package/dist/tools/batch-execute.js +5 -1
  61. package/dist/tools/batch-execute.js.map +1 -1
  62. package/dist/tools/capture-inline.js +30 -12
  63. package/dist/tools/capture-inline.js.map +1 -1
  64. package/dist/tools/capture-series.d.ts +46 -0
  65. package/dist/tools/capture-series.js +116 -0
  66. package/dist/tools/capture-series.js.map +1 -0
  67. package/dist/tools/game-view.d.ts +44 -0
  68. package/dist/tools/game-view.js +103 -0
  69. package/dist/tools/game-view.js.map +1 -0
  70. package/dist/tools/index.d.ts +1 -0
  71. package/dist/tools/index.js +34 -7
  72. package/dist/tools/index.js.map +1 -1
  73. package/dist/tools/inputsim-gesture.d.ts +46 -0
  74. package/dist/tools/inputsim-gesture.js +123 -0
  75. package/dist/tools/inputsim-gesture.js.map +1 -0
  76. package/dist/tools/inputsim-pointer.js +35 -2
  77. package/dist/tools/inputsim-pointer.js.map +1 -1
  78. package/dist/tools/inputsim-touch.js +42 -22
  79. package/dist/tools/inputsim-touch.js.map +1 -1
  80. package/dist/tools/jobs.js +1 -1
  81. package/dist/tools/jobs.js.map +1 -1
  82. package/dist/tools/player-state.d.ts +42 -0
  83. package/dist/tools/player-state.js +142 -0
  84. package/dist/tools/player-state.js.map +1 -0
  85. package/dist/tools/playtest-conditions.d.ts +334 -0
  86. package/dist/tools/playtest-conditions.js +99 -0
  87. package/dist/tools/playtest-conditions.js.map +1 -0
  88. package/dist/tools/playtest-session.d.ts +45 -0
  89. package/dist/tools/playtest-session.js +105 -0
  90. package/dist/tools/playtest-session.js.map +1 -0
  91. package/dist/tools/playtest-wait.d.ts +46 -0
  92. package/dist/tools/playtest-wait.js +86 -0
  93. package/dist/tools/playtest-wait.js.map +1 -0
  94. package/dist/tools/screenshot.js +31 -8
  95. package/dist/tools/screenshot.js.map +1 -1
  96. package/dist/tools/text-target.d.ts +22 -0
  97. package/dist/tools/text-target.js +39 -0
  98. package/dist/tools/text-target.js.map +1 -0
  99. package/dist/tools/ui-snapshot.d.ts +41 -0
  100. package/dist/tools/ui-snapshot.js +87 -0
  101. package/dist/tools/ui-snapshot.js.map +1 -0
  102. package/package.json +1 -1
@@ -2,6 +2,9 @@ import { setTimeout as delay } from "node:timers/promises";
2
2
  import { ProjectJobHttpError } from "../live-client.js";
3
3
  import { validateSchema } from "../tool-contract.js";
4
4
  import { runTests } from "../tools/run-tests.js";
5
+ import { inputsimGesture } from "../tools/inputsim-gesture.js";
6
+ import { playtestWait, PLAYTEST_WAIT_DEFAULT_TIMEOUT_MS } from "../tools/playtest-wait.js";
7
+ import { captureSeries, CAPTURE_SERIES_DEFAULT_START_TIMEOUT_MS } from "../tools/capture-series.js";
5
8
  import { JobManagerError } from "./job-manager.js";
6
9
  function invalid(errors) {
7
10
  if (errors.length)
@@ -144,4 +147,227 @@ export function projectCommandOperation(id, cancellable, client, poll = {}) {
144
147
  },
145
148
  };
146
149
  }
150
+ // ---------------------------------------------------------------------------
151
+ // Play-mode operations — one generic adapter for every tool whose work runs on
152
+ // the bridge's shared play-mode scheduler (a player-loop tick that owns timing,
153
+ // cancellation and reload / exit-play cleanup). The tool call starts the
154
+ // operation with the job id as its operation_id and returns at once; status and
155
+ // cancel go through POST /playmode-operations. Records are domain-local: a
156
+ // reload drops them (after releasing held input), which surfaces here as
157
+ // `operation_not_found` and orphans the job — never a restart.
158
+ // ---------------------------------------------------------------------------
159
+ /** Tools served by the generic `playmode_operation` jobs adapter. */
160
+ export const PLAYMODE_OPERATION_TOOLS = new Map([
161
+ [inputsimGesture.name, inputsimGesture.inputSchema],
162
+ [playtestWait.name, playtestWait.inputSchema],
163
+ [captureSeries.name, captureSeries.inputSchema],
164
+ ]);
165
+ /** Encoding cost assumed per captured frame (PNG encode of a native frame) for duration estimates. */
166
+ export const PLAYMODE_ENCODE_ESTIMATE_MS = 250;
167
+ const numbers = (v) => Array.isArray(v) ? v.map(Number).filter(Number.isFinite) : [];
168
+ /**
169
+ * Worst-case duration (ms) of a play-mode operation from its arguments: the
170
+ * gesture's last keyframe or capture, a wait's timeout, a series' start_on
171
+ * wait plus its schedule (frames at a conservative 30 fps) plus encoding.
172
+ * Decides inline-vs-job and sizes the job deadline.
173
+ */
174
+ export function playmodeEstimateMs(tool, args) {
175
+ if (tool === inputsimGesture.name) {
176
+ const fingers = Array.isArray(args.fingers) ? args.fingers : [];
177
+ const keyframes = fingers.flatMap(f => Array.isArray(f?.path) ? f.path.map(k => Number(k?.at_ms) || 0) : []);
178
+ const captures = numbers(args.capture_at_ms);
179
+ return Math.max(0, ...keyframes, ...captures) + captures.length * PLAYMODE_ENCODE_ESTIMATE_MS;
180
+ }
181
+ if (tool === playtestWait.name)
182
+ return typeof args.timeout_ms === "number" ? args.timeout_ms : PLAYTEST_WAIT_DEFAULT_TIMEOUT_MS;
183
+ if (tool === captureSeries.name) {
184
+ const atMs = numbers(args.at_ms), atFrames = numbers(args.at_frames);
185
+ const every = Number(args.every_ms), duration = Number(args.duration_ms);
186
+ let last = 0, count = 0;
187
+ if (atMs.length) {
188
+ last = Math.max(...atMs);
189
+ count = atMs.length;
190
+ }
191
+ else if (atFrames.length) {
192
+ last = Math.max(...atFrames) * 1000 / 30;
193
+ count = atFrames.length;
194
+ }
195
+ else if (every > 0 && duration >= 0) {
196
+ last = duration;
197
+ count = Math.floor(duration / every) + 1;
198
+ }
199
+ const trigger = args.start_on === undefined ? 0
200
+ : typeof args.start_timeout_ms === "number" ? args.start_timeout_ms : CAPTURE_SERIES_DEFAULT_START_TIMEOUT_MS;
201
+ return trigger + last + count * PLAYMODE_ENCODE_ESTIMATE_MS;
202
+ }
203
+ return 0;
204
+ }
205
+ /** Stable failure code of a terminal play-mode snapshot (the operation's own code when it set one). */
206
+ export function playmodeFailureCode(snapshot, fallback = "operation_failed") {
207
+ if (snapshot.state === "failed")
208
+ return typeof snapshot.result?.error_code === "string" ? snapshot.result.error_code : fallback;
209
+ return String(snapshot.reason ?? snapshot.state ?? fallback);
210
+ }
211
+ export const PLAYMODE_JOB_DEFAULT_DEADLINE_MS = 10 * 60_000;
212
+ export const PLAYMODE_JOB_DEFAULT_UNREACHABLE_MS = 2 * 60_000;
213
+ const PLAYMODE_TERMINAL = new Set(["succeeded", "failed", "cancelled", "orphaned"]);
214
+ /** Parsed JSON body of a tool result ({} when it is not JSON). */
215
+ export function toolResultBody(result) {
216
+ const text = result.content.find(item => item.type === "text");
217
+ if (text?.type !== "text")
218
+ return {};
219
+ try {
220
+ return JSON.parse(text.text);
221
+ }
222
+ catch {
223
+ return {};
224
+ }
225
+ }
226
+ /**
227
+ * The tool's own output: registry tools answer inside the gate envelope
228
+ * (`mutation.output` / `mutation.error`); other shapes are returned as-is.
229
+ */
230
+ export function toolOutput(result) {
231
+ const body = toolResultBody(result);
232
+ const mutation = body.mutation;
233
+ if (mutation && typeof mutation === "object") {
234
+ if (mutation.output && typeof mutation.output === "object")
235
+ return mutation.output;
236
+ if (mutation.error)
237
+ return { error: mutation.error };
238
+ }
239
+ return body;
240
+ }
241
+ /**
242
+ * Poll a scheduler operation to a terminal state. An abort of `signal` sends one
243
+ * cancel and keeps polling for its acknowledgement; at the deadline a cancel is
244
+ * sent once (the bridge then releases held input) before giving up. A cancel
245
+ * counts as sent only once the bridge answered it — a failed one is retried
246
+ * with backoff. An operation the deadline cancel ended is a `deadline`
247
+ * outcome, never a caller-initiated `cancelled`.
248
+ */
249
+ export async function pollPlaymodeOperation(live, operationId, options = {}) {
250
+ const deadlineMs = options.deadlineMs ?? PLAYMODE_JOB_DEFAULT_DEADLINE_MS;
251
+ const pollIntervalMs = options.pollIntervalMs ?? 250;
252
+ const unreachableMs = options.unreachableMs ?? PLAYMODE_JOB_DEFAULT_UNREACHABLE_MS;
253
+ const startedAt = Date.now();
254
+ let lastAnswer = Date.now();
255
+ let failures = 0;
256
+ let cancelSent = false;
257
+ let deadlineCancel = false;
258
+ let last = null;
259
+ while (true) {
260
+ const overdue = Date.now() - startedAt >= deadlineMs;
261
+ const wantCancel = !cancelSent && (overdue || options.signal?.aborted === true);
262
+ if (!wantCancel || failures > 0) {
263
+ try {
264
+ await delay(pollIntervalMs * 2 ** Math.min(failures, 3), undefined, wantCancel || cancelSent || !options.signal ? undefined : { signal: options.signal });
265
+ }
266
+ catch { /* aborted: send the cancel now */ }
267
+ }
268
+ const action = !cancelSent && (overdue || options.signal?.aborted === true) ? "cancel" : "status";
269
+ let answer;
270
+ try {
271
+ answer = await live.playmodeOperation({ action, operation_id: operationId });
272
+ if (action === "cancel") {
273
+ cancelSent = true;
274
+ deadlineCancel = options.signal?.aborted !== true;
275
+ }
276
+ if (failures)
277
+ options.onTransport?.(true, `Bridge answered again for operation ${operationId}.`);
278
+ failures = 0;
279
+ lastAnswer = Date.now();
280
+ }
281
+ catch (error) {
282
+ if (error instanceof ProjectJobHttpError && error.status < 500)
283
+ return { kind: "unreachable", error: String(error) };
284
+ if (failures++ === 0)
285
+ options.onTransport?.(false, `Operation poll failed (${String(error).slice(0, 200)}); retrying.`);
286
+ if (Date.now() - lastAnswer >= unreachableMs)
287
+ return { kind: "unreachable", error: `No answer for ${unreachableMs} ms.` };
288
+ continue;
289
+ }
290
+ if (answer.error?.code === "operation_not_found")
291
+ return { kind: "lost", detail: answer };
292
+ if (answer.error)
293
+ return { kind: "unreachable", error: `${answer.error.code}: ${answer.error.message}` };
294
+ last = answer;
295
+ options.onSnapshot?.(answer);
296
+ if (deadlineCancel && answer.state === "cancelled" && answer.reason === "cancelled")
297
+ return { kind: "deadline", snapshot: answer, cancelSent };
298
+ if (PLAYMODE_TERMINAL.has(String(answer.state)))
299
+ return { kind: "terminal", snapshot: answer, cancelSent };
300
+ // A cancel sent at the deadline gets a short grace window for its acknowledgement.
301
+ if (overdue && cancelSent && Date.now() - startedAt >= deadlineMs + 5_000)
302
+ return { kind: "deadline", snapshot: last, cancelSent };
303
+ }
304
+ }
305
+ /** Flatten a terminal scheduler snapshot into a job/tool result. */
306
+ export function playmodeResult(snapshot) {
307
+ const { result, ...meta } = snapshot;
308
+ return { operation: meta, ...(result && typeof result === "object" ? result : {}) };
309
+ }
310
+ export function playmodeOperation(tool, schema, client, poll = {}) {
311
+ return {
312
+ mutating: false, cancellable: true,
313
+ validate(args) {
314
+ if (args.operation_id !== undefined)
315
+ throw new JobManagerError("invalid_arguments", "Jobs own operation_id; use idempotency_key to retry.");
316
+ invalid(validateSchema(args, schema));
317
+ },
318
+ async run(args, context) {
319
+ const live = client(context.owner);
320
+ context.report({ phase: "starting" });
321
+ // Start is idempotent per operation id: a retried POST returns the same record.
322
+ const started = toolOutput(await live.route(tool, { ...args, operation_id: context.jobId }));
323
+ const operation = started.operation;
324
+ if (started.error || !operation)
325
+ return { state: "failed", error: { code: started.error?.code ?? "operation_rejected", message: started.error?.message ?? "Bridge did not start the play-mode operation." }, result: started };
326
+ if (operation.operation_id !== context.jobId)
327
+ throw new Error("Bridge did not confirm play-mode operation ownership.");
328
+ context.lifecycle("connected", `Bridge play-mode scheduler owns operation ${context.jobId}`, true);
329
+ let phase;
330
+ // The deadline outlives the operation's own worst case (a 10-minute wait).
331
+ const deadlineMs = poll.deadlineMs ?? Math.max(PLAYMODE_JOB_DEFAULT_DEADLINE_MS, playmodeEstimateMs(tool, args) + 2 * 60_000);
332
+ const outcome = await pollPlaymodeOperation(live, context.jobId, {
333
+ ...poll, deadlineMs, signal: context.signal,
334
+ onSnapshot: snapshot => {
335
+ const expected = Number(snapshot.progress?.expectedMs);
336
+ const elapsed = Number(snapshot.progress?.elapsedMs);
337
+ const fraction = expected > 0 && Number.isFinite(elapsed) ? Math.min(1, Math.max(0, elapsed / expected)) : undefined;
338
+ if (snapshot.phase !== phase || fraction !== undefined) {
339
+ phase = String(snapshot.phase);
340
+ context.report({ phase, ...(fraction === undefined ? {} : { fraction }) });
341
+ }
342
+ },
343
+ onTransport: (connected, detail) => context.lifecycle(connected ? "connected" : "disconnected", detail, true),
344
+ });
345
+ switch (outcome.kind) {
346
+ case "lost":
347
+ context.lifecycle("disconnected", "Bridge lost the play-mode operation (domain reload or Editor restart); its held input was released by that cleanup.", false);
348
+ return { state: "failed", error: { code: "operation_lost", message: "The bridge no longer knows this operation." }, result: outcome.detail };
349
+ case "unreachable":
350
+ context.lifecycle("disconnected", `Play-mode operation status unavailable: ${outcome.error}`, false);
351
+ return { state: "failed", error: { code: "job_status_unavailable", message: outcome.error } };
352
+ case "deadline":
353
+ context.lifecycle("disconnected", "Play-mode operation reported no terminal state before the deadline; cancel sent.", false);
354
+ return { state: "failed", error: { code: "job_deadline_exceeded", message: "No terminal state before the deadline." }, ...(outcome.snapshot ? { result: outcome.snapshot } : {}) };
355
+ }
356
+ const snapshot = outcome.snapshot;
357
+ const result = playmodeResult(snapshot);
358
+ if (snapshot.state === "succeeded")
359
+ return { state: "succeeded", result };
360
+ if (snapshot.state === "cancelled" && context.signal.aborted)
361
+ return { state: "cancelled", result };
362
+ if (snapshot.state === "orphaned") {
363
+ context.lifecycle("disconnected", `Bridge ended the operation without completing it (${snapshot.reason}).`, false);
364
+ return { state: "failed", error: { code: "operation_lost", message: String(snapshot.reason) }, result };
365
+ }
366
+ // cancelled without our request = play mode exited; failed = operation error
367
+ // (a wait that timed out, a game exception: the operation's own error_code).
368
+ return { state: "failed", error: { code: playmodeFailureCode(snapshot),
369
+ message: String(snapshot.result?.error ?? snapshot.reason ?? "Play-mode operation did not complete.") }, result };
370
+ },
371
+ };
372
+ }
147
373
  //# sourceMappingURL=adapters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/jobs/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAoC,MAAM,kBAAkB,CAAC;AAGrF,SAAS,OAAO,CAAC,MAAgB;IAC/B,IAAI,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,OAAO;QACL,oFAAoF;QACpF,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK;QAClC,QAAQ,CAAC,IAAI;YACX,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,gDAAgD,CAAC,CAAC;QAClI,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;YACrB,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,MAAM,EAAE,EAAE,GAAG,EAAE;gBACvI,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,gCAAgC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;gBACtF,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,sBAAsB,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;gBACtF,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,qEAAqE,EAAE,KAAK,CAAC,CAAC;YAClH,CAAC;YACD,IAAI,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC;gBAC/E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,wBAAwB,EAAE,EAAE,MAAM,EAAE,CAAC;YAC3J,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO;gBACpF,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,GAAG,MAAM,CAAC;AAC3D,wGAAwG;AACxG,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,MAAM,CAAC;AAG7D,MAAM,UAAU,uBAAuB,CAAC,EAAU,EAAE,WAAoB,EAAE,MAAiB,EAAE,OAA8B,EAAE;IAC3H,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,+BAA+B,CAAC;IACtE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,kCAAkC,CAAC;IAC/E,OAAO;QACL,QAAQ,EAAE,IAAI,EAAE,WAAW;QAC3B,QAAQ,CAAC,IAAI;YACX,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;YACzG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC,CAAC;QACpH,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAA0C,CAAC;YACnE,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW;gBAC9E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,uEAAuE,EAAE,EAAE,CAAC;YACvJ,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAChH,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK;gBAClF,UAAU,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC7H,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,IAAI,KAAyB,CAAC;YAC9B,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC3D,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,KAAK,eAAe;wBAAE,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,yCAAyC,EAAE,KAAK,CAAC,CAAC;oBAClI,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,IAAI,kBAAkB,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,IAAI,0BAA0B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;gBACnP,CAAC;gBACD,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBAC/F,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACxB,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,mBAAmB,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;oBACzE,kBAAkB,GAAG,IAAI,CAAC;gBAC5B,CAAC;gBACD,IAAI,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;oBAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;gBAAC,CAAC;gBACpG,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW;oBAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3F,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW;oBAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3F,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ;oBAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,mCAAmC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACtK,yEAAyE;gBACzE,2EAA2E;gBAC3E,wEAAwE;gBACxE,0EAA0E;gBAC1E,mDAAmD;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;gBACjB,OAAO,IAAI,EAAE,CAAC;oBACZ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;wBACzC,sEAAsE;wBACtE,uEAAuE;wBACvE,+DAA+D;wBAC/D,IAAI,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;4BAC/B,UAAU,GAAG,IAAI,CAAC;4BAClB,IAAI,CAAC;gCAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;4BAAC,CAAC;4BAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;wBAChH,CAAC;wBACD,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,gDAAgD,UAAU,uBAAuB,EAAE,KAAK,CAAC,CAAC;wBAC5H,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,4BAA4B,UAAU,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;oBAChJ,CAAC;oBACD,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,IAAI,aAAa,EAAE,CAAC;wBACzD,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,mCAAmC,aAAa,uBAAuB,EAAE,KAAK,CAAC,CAAC;wBAClH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,wBAAwB,aAAa,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;oBAChJ,CAAC;oBACD,kEAAkE;oBAClE,oEAAoE;oBACpE,iEAAiE;oBACjE,2CAA2C;oBAC3C,IAAI,CAAC;wBACH,MAAM,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,EAChE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;oBACzD,CAAC;oBAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC3E,IAAI,MAAM,KAAK,QAAQ;wBAAE,UAAU,GAAG,IAAI,CAAC;oBAC3C,IAAI,CAAC;wBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;wBAC3E,MAAM;oBACR,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,2EAA2E;wBAC3E,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;4BAAE,MAAM,KAAK,CAAC;wBAC5E,IAAI,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;4BACrB,6EAA6E;4BAC7E,kBAAkB,GAAG,KAAK,CAAC;4BAC3B,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,oBAAoB,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,yCAAyC,OAAO,CAAC,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC;wBACpJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/jobs/adapters.ts"],"names":[],"mappings":"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"}
@@ -3,36 +3,12 @@ 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
+ export declare const TOOL_OWNED_TIMEOUT_TOOLS: ReadonlySet<string>;
7
+ /** Retry only when the transport proves the POST could not reach a listener.
8
+ * A socket reset, response timeout, or a changed endpoint cannot rule out an
9
+ * already committed mutation. Aggregate connect failures must all be safe.
34
10
  */
35
- export declare function shouldRetryPostAfterFailure(err: unknown, endpointChanged: boolean): boolean;
11
+ export declare function shouldRetryPostAfterFailure(err: unknown): boolean;
36
12
  /** `/project-command-jobs` answered without a job snapshot; `status` is its non-OK HTTP status. */
37
13
  export declare class ProjectJobHttpError extends Error {
38
14
  readonly status: number;
@@ -175,15 +151,8 @@ export declare class LiveClient implements Router {
175
151
  * recovers (re-syncing the endpoint, waiting out a reload, or surfacing
176
152
  * the structured offline/dead-bridge error) and re-POSTs only when safe.
177
153
  *
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.
154
+ * The attempt counter caps safe connection retries at one initial POST
155
+ * plus this.retry.transientRetryAttempts. Ambiguous failures never replay.
187
156
  */
188
157
  private postTool;
189
158
  /**
@@ -206,28 +175,7 @@ export declare class LiveClient implements Router {
206
175
  * - unparsable body (bridge_response_unparsable corruption error).
207
176
  */
208
177
  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
- */
178
+ /** Recover connectivity, but replay only proven pre-connection failures. */
231
179
  private handlePostFailure;
232
180
  private ensureReady;
233
181
  /**
@@ -307,6 +255,15 @@ export declare class LiveClient implements Router {
307
255
  readResource(route: string): Promise<Record<string, unknown>>;
308
256
  /** Private job transport: one bounded request, never an automatic mutation retry. */
309
257
  projectCommandJob(args: Record<string, unknown>): Promise<Record<string, any>>;
258
+ /**
259
+ * Status / cancel for an operation owned by the bridge's shared play-mode
260
+ * scheduler (started through its tool, e.g. inputsim_gesture). One bounded
261
+ * request; a non-2xx answer throws so callers can retry or give up.
262
+ */
263
+ playmodeOperation(args: {
264
+ action: "status" | "cancel";
265
+ operation_id: string;
266
+ }): Promise<Record<string, any>>;
310
267
  /** Fresh authenticated bounded catalog read; no disk/session cache can hide a reload. */
311
268
  projectCommands(args: Record<string, unknown>): Promise<Record<string, unknown>>;
312
269
  /**
@@ -73,6 +73,14 @@ const DIRECT_RESPONSE_TOOLS = new Set([
73
73
  "unity_senses_profiler_rendering",
74
74
  "unity_senses_spatial_query",
75
75
  ]);
76
+ // Tools whose `timeout_ms` is their OWN parameter (a playtest_wait's wall-clock
77
+ // limit, up to 10 minutes), not the request budget: the value is forwarded as
78
+ // sent — never clamped to the host-safe cap — and the HTTP fetch keeps the
79
+ // default budget, because the call itself only starts an operation on the
80
+ // bridge's play-mode scheduler and answers at once.
81
+ export const TOOL_OWNED_TIMEOUT_TOOLS = new Set([
82
+ "unity_open_mcp_playtest_wait",
83
+ ]);
76
84
  // M4 — compile-reload tools whose PURPOSE is to trigger or observe a domain
77
85
  // reload, so a no-op compile is a meaningful signal worth annotating. This is
78
86
  // the annotation target set; it is a strict subset of the lifecycle
@@ -127,44 +135,21 @@ const COMPILE_REPOST_SENTINEL = { __compileRepost: 0 };
127
135
  function isCompileRepostSentinel(v) {
128
136
  return typeof v === "object" && v !== null && "__compileRepost" in v;
129
137
  }
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).
138
+ /** Retry only when the transport proves the POST could not reach a listener.
139
+ * A socket reset, response timeout, or a changed endpoint cannot rule out an
140
+ * already committed mutation. Aggregate connect failures must all be safe.
158
141
  */
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;
142
+ export function shouldRetryPostAfterFailure(err) {
143
+ if (!(err instanceof TypeError))
144
+ return false;
145
+ const isConnectFailure = (cause) => {
146
+ if (cause instanceof AggregateError)
147
+ return cause.errors.length > 0 && cause.errors.every(isConnectFailure);
148
+ if (!cause || typeof cause !== "object" || !("code" in cause))
149
+ return false;
150
+ return ["ECONNREFUSED", "ENOTFOUND", "EAI_AGAIN", "UND_ERR_CONNECT_TIMEOUT"].includes(String(cause.code));
151
+ };
152
+ return isConnectFailure(err.cause);
168
153
  }
169
154
  const OFFLINE_HINT = "Ensure the Unity Editor is open with the Agent Bridge running. " +
170
155
  "The bridge port is per-project (20000 + sha256(projectPath) % 10000), not " +
@@ -781,15 +766,8 @@ export class LiveClient {
781
766
  * recovers (re-syncing the endpoint, waiting out a reload, or surfacing
782
767
  * the structured offline/dead-bridge error) and re-POSTs only when safe.
783
768
  *
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.
769
+ * The attempt counter caps safe connection retries at one initial POST
770
+ * plus this.retry.transientRetryAttempts. Ambiguous failures never replay.
793
771
  */
794
772
  async postTool(toolName, args, retryOn503, attempt = 1, commandLifecycle) {
795
773
  try {
@@ -818,7 +796,8 @@ export class LiveClient {
818
796
  * caller's catch runs {@link handlePostFailure}.
819
797
  */
820
798
  async postToolFetch(toolName, args, retryOn503, commandLifecycle) {
821
- const rawTimeout = args.timeout_ms;
799
+ const toolOwnedTimeout = TOOL_OWNED_TIMEOUT_TOOLS.has(toolName);
800
+ const rawTimeout = toolOwnedTimeout ? undefined : args.timeout_ms;
822
801
  const explicitTimeout = typeof rawTimeout === "number";
823
802
  const requestedTimeoutMs = explicitTimeout ? rawTimeout : 60_000;
824
803
  // feedback S2 — clamp below a typical MCP host request timeout (~60s) so the
@@ -829,8 +808,9 @@ export class LiveClient {
829
808
  // own processing deadline agrees) and used for the fetch deadline below.
830
809
  const timeoutMs = Math.min(Math.max(requestedTimeoutMs, BRIDGE_MIN_TIMEOUT_MS), BRIDGE_HOST_SAFE_TIMEOUT_CAP_MS);
831
810
  const wasClamped = requestedTimeoutMs > timeoutMs;
832
- // Forward the clamped value so the bridge times out at the same boundary.
833
- const forwardedArgs = wasClamped
811
+ // Forward the clamped value so the bridge times out at the same boundary
812
+ // (a tool-owned timeout_ms travels unchanged).
813
+ const forwardedArgs = wasClamped && !toolOwnedTimeout
834
814
  ? { ...args, timeout_ms: timeoutMs }
835
815
  : args;
836
816
  // Floor the client fetch timeout at the bridge's own default wait + slack
@@ -1163,61 +1143,33 @@ export class LiveClient {
1163
1143
  isError: parsed.error != null,
1164
1144
  };
1165
1145
  }
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
- */
1146
+ /** Recover connectivity, but replay only proven pre-connection failures. */
1188
1147
  async handlePostFailure(toolName, args, err, retryOn503, attempt, commandLifecycle) {
1189
- const endpointBefore = this.baseUrl;
1190
1148
  const recovered = await this.handleTransientOffline("post");
1191
1149
  if (recovered !== null)
1192
1150
  return recovered;
1193
- const endpointChanged = this.baseUrl !== endpointBefore;
1194
1151
  // M10 — bound the postTool → handlePostFailure → postTool recursion. The
1195
1152
  // budget is the initial attempt plus the configured transient retry count.
1196
1153
  const maxAttempts = 1 + this.retry.transientRetryAttempts;
1197
1154
  const attemptsExhausted = attempt >= maxAttempts;
1198
1155
  if (toolName !== "unity_open_mcp_project_commands" &&
1199
1156
  !attemptsExhausted &&
1200
- shouldRetryPostAfterFailure(err, endpointChanged)) {
1157
+ shouldRetryPostAfterFailure(err)) {
1201
1158
  return this.postTool(toolName, args, retryOn503, attempt + 1, commandLifecycle);
1202
1159
  }
1203
1160
  const exhaustedNote = attemptsExhausted
1204
1161
  ? ` 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
1162
  : "";
1163
+ const ambiguity = shouldRetryPostAfterFailure(err)
1164
+ ? `The connection was refused before the request reached the bridge, so it was not applied.`
1165
+ : `A socket failure, timeout, or endpoint change does not prove the original ` +
1166
+ `operation was not applied; verify its effect before retrying.`;
1167
+ const message = `Tool '${toolName}' did not return a confirmed result. No further POST was sent. ` +
1168
+ `${ambiguity} Endpoint: ${this.baseUrl}.${exhaustedNote}`;
1206
1169
  return makeErrorResult({
1207
1170
  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
- },
1171
+ message,
1172
+ detail: { error: { code: "bridge_offline", message } },
1221
1173
  });
1222
1174
  }
1223
1175
  async ensureReady() {
@@ -1718,6 +1670,19 @@ export class LiveClient {
1718
1670
  throw new ProjectJobHttpError(response.status);
1719
1671
  return await response.json();
1720
1672
  }
1673
+ /**
1674
+ * Status / cancel for an operation owned by the bridge's shared play-mode
1675
+ * scheduler (started through its tool, e.g. inputsim_gesture). One bounded
1676
+ * request; a non-2xx answer throws so callers can retry or give up.
1677
+ */
1678
+ async playmodeOperation(args) {
1679
+ const response = await this.fetchWithTimeout("/playmode-operations", {
1680
+ method: "POST", body: JSON.stringify(args), headers: { "Content-Type": "application/json" },
1681
+ }, 10_000);
1682
+ if (!response.ok)
1683
+ throw new ProjectJobHttpError(response.status);
1684
+ return await response.json();
1685
+ }
1721
1686
  /** Fresh authenticated bounded catalog read; no disk/session cache can hide a reload. */
1722
1687
  async projectCommands(args) {
1723
1688
  const query = new URLSearchParams({ catalog: "project_commands" });