@mseep/anklebreaker-unity-mcp 2.30.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.
@@ -0,0 +1,1690 @@
1
+ // Unity Editor HTTP Bridge Client
2
+ // Communicates with the C# plugin running inside Unity Editor
3
+ // Supports both queue mode (async ticket-based) and legacy sync mode
4
+ import { CONFIG } from "./config.js";
5
+ import { getActiveBridgeUrl } from "./instance-discovery.js";
6
+
7
+ // Dynamic bridge URL â€" resolved per-call based on selected instance
8
+ function getBridgeUrl() {
9
+ return getActiveBridgeUrl();
10
+ }
11
+
12
+ // Legacy constant kept for backward compat in places that don't need dynamic routing
13
+ const BRIDGE_URL = `http://${CONFIG.editorBridgeHost}:${CONFIG.editorBridgePort}`;
14
+
15
+ // Agent identity â€" tracks which AI agent is making requests
16
+ let _currentAgentId = "default";
17
+
18
+ // Mode detection â€" cached to avoid repeated 404 checks
19
+ let _useQueueMode = true;
20
+ let _queueModeDetermined = false;
21
+
22
+ /**
23
+ * Set the current agent ID. All subsequent sendCommand calls include this as X-Agent-Id header.
24
+ */
25
+ export function setAgentId(agentId) {
26
+ _currentAgentId = agentId || "default";
27
+ }
28
+
29
+ // Retry settings â€" handles Unity domain reloads (1-3 sec server downtime)
30
+ const MAX_RETRIES = 4;
31
+ const RETRY_BASE_DELAY_MS = 800; // 800ms, 1600ms, 3200ms, 6400ms
32
+
33
+ /**
34
+ * Sleep helper for retry backoff
35
+ */
36
+ function sleep(ms) {
37
+ return new Promise((resolve) => setTimeout(resolve, ms));
38
+ }
39
+
40
+ /**
41
+ * Returns true if the error looks like a transient connection issue
42
+ * (server temporarily down during Unity domain reload).
43
+ */
44
+ function isTransientError(error, response) {
45
+ if (error) {
46
+ // Connection refused / reset / aborted â€" server is restarting
47
+ const msg = error.message || "";
48
+ return (
49
+ error.code === "ECONNREFUSED" ||
50
+ error.code === "ECONNRESET" ||
51
+ msg.includes("ECONNREFUSED") ||
52
+ msg.includes("ECONNRESET") ||
53
+ msg.includes("fetch failed") ||
54
+ error.name === "AbortError"
55
+ );
56
+ }
57
+ // HTTP 500/503 during domain reload (server half-alive)
58
+ if (response && (response.status === 503 || response.status === 500)) {
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+
64
+ /**
65
+ * Submit a command to the queue and get a ticket ID.
66
+ * POST /api/queue/submit with {apiPath, method, body, agentId}
67
+ */
68
+ async function submitToQueue(apiPath, bodyString) {
69
+ const url = `${getBridgeUrl()}/api/queue/submit`;
70
+
71
+ const response = await fetch(url, {
72
+ method: "POST",
73
+ headers: {
74
+ "Content-Type": "application/json",
75
+ "X-Agent-Id": _currentAgentId,
76
+ },
77
+ body: JSON.stringify({
78
+ apiPath,
79
+ method: "POST",
80
+ body: bodyString,
81
+ agentId: _currentAgentId,
82
+ }),
83
+ signal: AbortSignal.timeout(CONFIG.editorBridgeTimeout),
84
+ });
85
+
86
+ if (!response.ok) {
87
+ const text = await response.text();
88
+ throw new Error(`HTTP ${response.status}: ${text}`);
89
+ }
90
+
91
+ const data = await response.json();
92
+ return data; // { ticketId, queuePosition, ... }
93
+ }
94
+
95
+ /**
96
+ * Poll the queue status for a ticket until completion.
97
+ * GET /api/queue/status?ticketId=X
98
+ */
99
+ async function pollQueueStatus(ticketId) {
100
+ let pollIntervalMs = CONFIG.queuePollIntervalMs;
101
+ const maxIntervalMs = Math.min(1000, CONFIG.queuePollMaxMs);
102
+ const startTime = Date.now();
103
+ // Use dedicated poll timeout (longer than bridge timeout to handle slow operations like execute_code)
104
+ const timeoutMs = CONFIG.queuePollTimeoutMs || CONFIG.editorBridgeTimeout;
105
+ let consecutive404s = 0;
106
+ const max404Grace = 5; // Allow a few 404s during the dequeueâ†'execute race window
107
+
108
+ while (true) {
109
+ // Check timeout
110
+ if (Date.now() - startTime > timeoutMs) {
111
+ return {
112
+ success: false,
113
+ error: `Queue polling timed out after ${timeoutMs}ms for ticket ${ticketId}`,
114
+ };
115
+ }
116
+
117
+ // Poll status
118
+ try {
119
+ const url = `${getBridgeUrl()}/api/queue/status?ticketId=${ticketId}`;
120
+ const response = await fetch(url, {
121
+ method: "GET",
122
+ headers: {
123
+ "X-Agent-Id": _currentAgentId,
124
+ },
125
+ signal: AbortSignal.timeout(10000), // 10s per individual poll request
126
+ });
127
+
128
+ if (!response.ok) {
129
+ // Grace period for 404 â€" ticket may be between dequeue and execution tracking
130
+ if (response.status === 404) {
131
+ consecutive404s++;
132
+ if (consecutive404s < max404Grace) {
133
+ await sleep(pollIntervalMs);
134
+ pollIntervalMs = Math.min(Math.ceil(pollIntervalMs * 1.5), maxIntervalMs);
135
+ continue;
136
+ }
137
+ }
138
+ const text = await response.text();
139
+ return {
140
+ success: false,
141
+ error: `Failed to poll queue status: HTTP ${response.status}: ${text}`,
142
+ };
143
+ }
144
+
145
+ // Reset 404 counter on successful poll
146
+ consecutive404s = 0;
147
+
148
+ const statusData = await response.json();
149
+
150
+ // Check completion status
151
+ if (statusData.status === "Completed") {
152
+ // Extract result â€" use explicit undefined check so falsy values (null, 0, false, "") pass through
153
+ return {
154
+ success: true,
155
+ data: statusData.result !== undefined ? statusData.result : statusData,
156
+ };
157
+ } else if (statusData.status === "Failed") {
158
+ return {
159
+ success: false,
160
+ error: statusData.error || "Queue processing failed",
161
+ };
162
+ }
163
+
164
+ // Still processing â€" wait before polling again
165
+ await sleep(pollIntervalMs);
166
+
167
+ // Increase poll interval up to max
168
+ pollIntervalMs = Math.min(
169
+ Math.ceil(pollIntervalMs * 1.5),
170
+ maxIntervalMs
171
+ );
172
+ } catch (error) {
173
+ return {
174
+ success: false,
175
+ error: `Error polling queue: ${error.message}`,
176
+ };
177
+ }
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Send command via legacy sync mode (direct POST).
183
+ * Falls back to the original implementation.
184
+ */
185
+ async function sendCommandLegacyMode(command, params = {}) {
186
+ const url = `${getBridgeUrl()}/api/${command}`;
187
+ let lastError = null;
188
+
189
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
190
+ const controller = new AbortController();
191
+ const timeout = setTimeout(() => controller.abort(), CONFIG.editorBridgeTimeout);
192
+
193
+ try {
194
+ const response = await fetch(url, {
195
+ method: "POST",
196
+ headers: {
197
+ "Content-Type": "application/json",
198
+ "X-Agent-Id": _currentAgentId,
199
+ },
200
+ body: JSON.stringify(params),
201
+ signal: controller.signal,
202
+ });
203
+ clearTimeout(timeout);
204
+
205
+ // Transient server error â€" retry
206
+ if (isTransientError(null, response) && attempt < MAX_RETRIES) {
207
+ const delay = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
208
+ console.error(
209
+ `[MCP Bridge] HTTP ${response.status} on ${command}, retrying in ${delay}ms (${attempt + 1}/${MAX_RETRIES})...`
210
+ );
211
+ await sleep(delay);
212
+ continue;
213
+ }
214
+
215
+ if (!response.ok) {
216
+ const text = await response.text();
217
+ return { success: false, error: `HTTP ${response.status}: ${text}` };
218
+ }
219
+
220
+ const data = await response.json();
221
+
222
+ // If we retried, log that we recovered
223
+ if (attempt > 0) {
224
+ console.error(
225
+ `[MCP Bridge] Recovered after ${attempt} retries for ${command}`
226
+ );
227
+ }
228
+
229
+ return { success: true, data };
230
+ } catch (error) {
231
+ clearTimeout(timeout);
232
+ lastError = error;
233
+
234
+ // Transient connection error â€" retry with backoff
235
+ if (isTransientError(error, null) && attempt < MAX_RETRIES) {
236
+ const delay = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
237
+ console.error(
238
+ `[MCP Bridge] ${error.code || error.name || "Error"} on ${command}, retrying in ${delay}ms (${attempt + 1}/${MAX_RETRIES})...`
239
+ );
240
+ await sleep(delay);
241
+ continue;
242
+ }
243
+ }
244
+ }
245
+
246
+ // All retries exhausted
247
+ if (lastError?.name === "AbortError") {
248
+ return {
249
+ success: false,
250
+ error:
251
+ "Request timed out after retries. Unity Editor may be in a long domain reload or not running.",
252
+ };
253
+ }
254
+ return {
255
+ success: false,
256
+ error: `Connection failed after ${MAX_RETRIES} retries: ${lastError?.message}. Unity Editor may be reloading or not running.`,
257
+ };
258
+ }
259
+
260
+ /**
261
+ * Send a command to the Unity Editor bridge.
262
+ * Tries queue mode first (async ticket-based), falls back to legacy sync mode if 404.
263
+ * Automatically retries on transient failures (e.g. Unity domain reload)
264
+ * with exponential backoff so multi-agent workflows stay resilient.
265
+ */
266
+ export async function sendCommand(command, params = {}) {
267
+ const bodyString = JSON.stringify(params);
268
+
269
+ // If we've determined the plugin doesn't support queue mode, use legacy
270
+ if (_queueModeDetermined && !_useQueueMode) {
271
+ return sendCommandLegacyMode(command, params);
272
+ }
273
+
274
+ // Try queue mode (if not yet determined it's unavailable)
275
+ if (!_queueModeDetermined || _useQueueMode) {
276
+ try {
277
+ // Submit to queue with retry logic
278
+ let submitLastError = null;
279
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
280
+ try {
281
+ const ticketData = await submitToQueue(command, bodyString);
282
+ const ticketId = ticketData.ticketId;
283
+
284
+ // Log to stderr, not stdout — stdout is reserved for the MCP JSON-RPC
285
+ // transport and any non-JSON data there closes strict clients (e.g. Codex).
286
+ console.error(`[MCP Bridge] Submitted ${command} to queue, ticket: ${ticketId}`);
287
+
288
+ // Poll for completion
289
+ const result = await pollQueueStatus(ticketId);
290
+
291
+ // Queue submission succeeded (we got a ticket), so queue mode is confirmed
292
+ _queueModeDetermined = true;
293
+ _useQueueMode = true;
294
+ return result;
295
+ } catch (submitError) {
296
+ submitLastError = submitError;
297
+
298
+ // Check if it's a transient error worth retrying
299
+ if (isTransientError(submitError, null) && attempt < MAX_RETRIES) {
300
+ const delay = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
301
+ console.error(
302
+ `[MCP Bridge] Error submitting to queue: ${submitError.message}, retrying in ${delay}ms (${attempt + 1}/${MAX_RETRIES})...`
303
+ );
304
+ await sleep(delay);
305
+ continue;
306
+ }
307
+
308
+ // Check if it's a 404 (queue not supported) â€" match "HTTP 404" or raw status code
309
+ if (submitError.status === 404 || (submitError.message && /HTTP\s*404/.test(submitError.message))) {
310
+ console.warn(
311
+ `[MCP Bridge] Queue mode not supported (HTTP 404), falling back to legacy sync mode`
312
+ );
313
+ _queueModeDetermined = true;
314
+ _useQueueMode = false;
315
+ return sendCommandLegacyMode(command, params);
316
+ }
317
+
318
+ // Other errors â€" don't retry, mark mode as undetermined and try legacy
319
+ break;
320
+ }
321
+ }
322
+
323
+ // If we get here, queue submit failed after retries
324
+ if (submitLastError) {
325
+ console.warn(
326
+ `[MCP Bridge] Queue mode failed after retries, falling back to legacy sync mode: ${submitLastError.message}`
327
+ );
328
+ _queueModeDetermined = true;
329
+ _useQueueMode = false;
330
+ return sendCommandLegacyMode(command, params);
331
+ }
332
+ } catch (error) {
333
+ console.warn(
334
+ `[MCP Bridge] Unexpected error in queue mode, falling back to legacy: ${error.message}`
335
+ );
336
+ _queueModeDetermined = true;
337
+ _useQueueMode = false;
338
+ return sendCommandLegacyMode(command, params);
339
+ }
340
+ }
341
+
342
+ // Fallback (should not reach here, but just in case)
343
+ return sendCommandLegacyMode(command, params);
344
+ }
345
+
346
+ /**
347
+ * Get queue information and stats.
348
+ * GET /api/queue/info
349
+ */
350
+ export async function getQueueInfo() {
351
+ try {
352
+ const url = `${getBridgeUrl()}/api/queue/info`;
353
+ const response = await fetch(url, {
354
+ method: "GET",
355
+ headers: {
356
+ "X-Agent-Id": _currentAgentId,
357
+ },
358
+ signal: AbortSignal.timeout(CONFIG.editorBridgeTimeout),
359
+ });
360
+
361
+ if (!response.ok) {
362
+ const text = await response.text();
363
+ return { success: false, error: `HTTP ${response.status}: ${text}` };
364
+ }
365
+
366
+ const data = await response.json();
367
+ return { success: true, data };
368
+ } catch (error) {
369
+ return {
370
+ success: false,
371
+ error: `Failed to get queue info: ${error.message}`,
372
+ };
373
+ }
374
+ }
375
+
376
+ /**
377
+ * Get status of a specific queue ticket.
378
+ * GET /api/queue/status?ticketId=X
379
+ */
380
+ export async function getTicketStatus(ticketId) {
381
+ try {
382
+ const url = `${getBridgeUrl()}/api/queue/status?ticketId=${ticketId}`;
383
+ const response = await fetch(url, {
384
+ method: "GET",
385
+ headers: {
386
+ "X-Agent-Id": _currentAgentId,
387
+ },
388
+ signal: AbortSignal.timeout(CONFIG.editorBridgeTimeout),
389
+ });
390
+
391
+ if (!response.ok) {
392
+ const text = await response.text();
393
+ return { success: false, error: `HTTP ${response.status}: ${text}` };
394
+ }
395
+
396
+ const data = await response.json();
397
+ return { success: true, data };
398
+ } catch (error) {
399
+ return {
400
+ success: false,
401
+ error: `Failed to get ticket status: ${error.message}`,
402
+ };
403
+ }
404
+ }
405
+
406
+ /**
407
+ * Check if the Unity Editor bridge is reachable
408
+ */
409
+ export async function ping() {
410
+ try {
411
+ const response = await fetch(`${getBridgeUrl()}/api/ping`, {
412
+ method: "GET",
413
+ signal: AbortSignal.timeout(3000),
414
+ });
415
+ if (response.ok) {
416
+ const data = await response.json();
417
+ return { connected: true, ...data };
418
+ }
419
+ return { connected: false, error: `HTTP ${response.status}` };
420
+ } catch {
421
+ return { connected: false, error: "Unity Editor bridge not reachable" };
422
+ }
423
+ }
424
+
425
+ // â"€â"€â"€ Convenience wrappers for common Editor operations â"€â"€â"€
426
+
427
+ export async function getSceneInfo() {
428
+ return sendCommand("scene/info");
429
+ }
430
+
431
+ export async function openScene(scenePath) {
432
+ return sendCommand("scene/open", { path: scenePath });
433
+ }
434
+
435
+ export async function saveScene() {
436
+ return sendCommand("scene/save");
437
+ }
438
+
439
+ export async function newScene() {
440
+ return sendCommand("scene/new");
441
+ }
442
+
443
+ export async function getHierarchy(params) {
444
+ return sendCommand("scene/hierarchy", params);
445
+ }
446
+
447
+ export async function createGameObject(params) {
448
+ return sendCommand("gameobject/create", params);
449
+ }
450
+
451
+ export async function deleteGameObject(params) {
452
+ return sendCommand("gameobject/delete", params);
453
+ }
454
+
455
+ export async function getGameObjectInfo(params) {
456
+ return sendCommand("gameobject/info", params);
457
+ }
458
+
459
+ export async function setTransform(params) {
460
+ return sendCommand("gameobject/set-transform", params);
461
+ }
462
+
463
+ export async function addComponent(params) {
464
+ return sendCommand("component/add", params);
465
+ }
466
+
467
+ export async function removeComponent(params) {
468
+ return sendCommand("component/remove", params);
469
+ }
470
+
471
+ export async function setComponentProperty(params) {
472
+ return sendCommand("component/set-property", params);
473
+ }
474
+
475
+ export async function getComponentProperties(params) {
476
+ return sendCommand("component/get-properties", params);
477
+ }
478
+
479
+ export async function setComponentReference(params) {
480
+ return sendCommand("component/set-reference", params);
481
+ }
482
+
483
+ export async function batchWireReferences(params) {
484
+ return sendCommand("component/batch-wire", params);
485
+ }
486
+
487
+ export async function getReferenceableObjects(params) {
488
+ return sendCommand("component/get-referenceable", params);
489
+ }
490
+
491
+ export async function executeMenuItem(menuPath) {
492
+ return sendCommand("editor/execute-menu-item", { menuPath });
493
+ }
494
+
495
+ export async function getProjectInfo() {
496
+ return sendCommand("project/info");
497
+ }
498
+
499
+ export async function getAssetList(params) {
500
+ return sendCommand("asset/list", params);
501
+ }
502
+
503
+ export async function importAsset(params) {
504
+ return sendCommand("asset/import", params);
505
+ }
506
+
507
+ export async function deleteAsset(params) {
508
+ return sendCommand("asset/delete", params);
509
+ }
510
+
511
+ export async function createScript(params) {
512
+ return sendCommand("script/create", params);
513
+ }
514
+
515
+ export async function readScript(params) {
516
+ return sendCommand("script/read", params);
517
+ }
518
+
519
+ export async function updateScript(params) {
520
+ return sendCommand("script/update", params);
521
+ }
522
+
523
+ export async function buildProject(params) {
524
+ return sendCommand("build/start", params);
525
+ }
526
+
527
+ export async function getConsoleLog(params) {
528
+ return sendCommand("console/log", params);
529
+ }
530
+
531
+ export async function clearConsoleLog() {
532
+ return sendCommand("console/clear");
533
+ }
534
+
535
+ export async function getCompilationErrors(params) {
536
+ return sendCommand("compilation/errors", params);
537
+ }
538
+
539
+ export async function playMode(action) {
540
+ return sendCommand("editor/play-mode", { action }); // "play", "pause", "stop"
541
+ }
542
+
543
+ export async function getEditorState() {
544
+ return sendCommand("editor/state");
545
+ }
546
+
547
+ export async function executeCode(code) {
548
+ return sendCommand("editor/execute-code", { code });
549
+ }
550
+
551
+ export async function createPrefab(params) {
552
+ return sendCommand("asset/create-prefab", params);
553
+ }
554
+
555
+ export async function instantiatePrefab(params) {
556
+ return sendCommand("asset/instantiate-prefab", params);
557
+ }
558
+
559
+ export async function setMaterial(params) {
560
+ return sendCommand("renderer/set-material", params);
561
+ }
562
+
563
+ export async function createMaterial(params) {
564
+ return sendCommand("asset/create-material", params);
565
+ }
566
+
567
+ // â"€â"€â"€ Animation â"€â"€â"€
568
+
569
+ export async function createAnimatorController(params) {
570
+ return sendCommand("animation/create-controller", params);
571
+ }
572
+
573
+ export async function getAnimatorControllerInfo(params) {
574
+ return sendCommand("animation/controller-info", params);
575
+ }
576
+
577
+ export async function addAnimationParameter(params) {
578
+ return sendCommand("animation/add-parameter", params);
579
+ }
580
+
581
+ export async function removeAnimationParameter(params) {
582
+ return sendCommand("animation/remove-parameter", params);
583
+ }
584
+
585
+ export async function addAnimationState(params) {
586
+ return sendCommand("animation/add-state", params);
587
+ }
588
+
589
+ export async function removeAnimationState(params) {
590
+ return sendCommand("animation/remove-state", params);
591
+ }
592
+
593
+ export async function addAnimationTransition(params) {
594
+ return sendCommand("animation/add-transition", params);
595
+ }
596
+
597
+ export async function createAnimationClip(params) {
598
+ return sendCommand("animation/create-clip", params);
599
+ }
600
+
601
+ export async function getAnimationClipInfo(params) {
602
+ return sendCommand("animation/clip-info", params);
603
+ }
604
+
605
+ export async function setAnimationClipCurve(params) {
606
+ return sendCommand("animation/set-clip-curve", params);
607
+ }
608
+
609
+ export async function addAnimationLayer(params) {
610
+ return sendCommand("animation/add-layer", params);
611
+ }
612
+
613
+ export async function assignAnimatorController(params) {
614
+ return sendCommand("animation/assign-controller", params);
615
+ }
616
+
617
+ export async function getCurveKeyframes(params) {
618
+ return sendCommand("animation/get-curve-keyframes", params);
619
+ }
620
+
621
+ export async function removeCurve(params) {
622
+ return sendCommand("animation/remove-curve", params);
623
+ }
624
+
625
+ export async function addKeyframe(params) {
626
+ return sendCommand("animation/add-keyframe", params);
627
+ }
628
+
629
+ export async function removeKeyframe(params) {
630
+ return sendCommand("animation/remove-keyframe", params);
631
+ }
632
+
633
+ export async function addAnimationEvent(params) {
634
+ return sendCommand("animation/add-event", params);
635
+ }
636
+
637
+ export async function removeAnimationEvent(params) {
638
+ return sendCommand("animation/remove-event", params);
639
+ }
640
+
641
+ export async function getAnimationEvents(params) {
642
+ return sendCommand("animation/get-events", params);
643
+ }
644
+
645
+ export async function setClipSettings(params) {
646
+ return sendCommand("animation/set-clip-settings", params);
647
+ }
648
+
649
+ export async function removeAnimationTransition(params) {
650
+ return sendCommand("animation/remove-transition", params);
651
+ }
652
+
653
+ export async function removeAnimationLayer(params) {
654
+ return sendCommand("animation/remove-layer", params);
655
+ }
656
+
657
+ export async function createBlendTree(params) {
658
+ return sendCommand("animation/create-blend-tree", params);
659
+ }
660
+
661
+ export async function getBlendTreeInfo(params) {
662
+ return sendCommand("animation/get-blend-tree", params);
663
+ }
664
+
665
+ // â"€â"€â"€ Prefab (Advanced) â"€â"€â"€
666
+
667
+ export async function getPrefabInfo(params) {
668
+ return sendCommand("prefab/info", params);
669
+ }
670
+
671
+ export async function createPrefabVariant(params) {
672
+ return sendCommand("prefab/create-variant", params);
673
+ }
674
+
675
+ export async function applyPrefabOverrides(params) {
676
+ return sendCommand("prefab/apply-overrides", params);
677
+ }
678
+
679
+ export async function revertPrefabOverrides(params) {
680
+ return sendCommand("prefab/revert-overrides", params);
681
+ }
682
+
683
+ export async function unpackPrefab(params) {
684
+ return sendCommand("prefab/unpack", params);
685
+ }
686
+
687
+ export async function setObjectReference(params) {
688
+ return sendCommand("prefab/set-object-reference", params);
689
+ }
690
+
691
+ export async function duplicateGameObject(params) {
692
+ return sendCommand("prefab/duplicate", params);
693
+ }
694
+
695
+ export async function setGameObjectActive(params) {
696
+ return sendCommand("prefab/set-active", params);
697
+ }
698
+
699
+ export async function reparentGameObject(params) {
700
+ return sendCommand("prefab/reparent", params);
701
+ }
702
+
703
+ // â"€â"€â"€ Prefab Asset (Direct Editing) â"€â"€â"€
704
+
705
+ export async function getPrefabAssetHierarchy(params) {
706
+ return sendCommand("prefab-asset/hierarchy", params);
707
+ }
708
+
709
+ export async function getPrefabAssetProperties(params) {
710
+ return sendCommand("prefab-asset/get-properties", params);
711
+ }
712
+
713
+ export async function setPrefabAssetProperty(params) {
714
+ return sendCommand("prefab-asset/set-property", params);
715
+ }
716
+
717
+ export async function addPrefabAssetComponent(params) {
718
+ return sendCommand("prefab-asset/add-component", params);
719
+ }
720
+
721
+ export async function removePrefabAssetComponent(params) {
722
+ return sendCommand("prefab-asset/remove-component", params);
723
+ }
724
+
725
+ export async function setPrefabAssetReference(params) {
726
+ return sendCommand("prefab-asset/set-reference", params);
727
+ }
728
+
729
+ export async function addPrefabAssetGameObject(params) {
730
+ return sendCommand("prefab-asset/add-gameobject", params);
731
+ }
732
+
733
+ export async function removePrefabAssetGameObject(params) {
734
+ return sendCommand("prefab-asset/remove-gameobject", params);
735
+ }
736
+
737
+ // â"€â"€â"€ Prefab Variant Management â"€â"€â"€
738
+
739
+ export async function getPrefabVariantInfo(params) {
740
+ return sendCommand("prefab-asset/variant-info", params);
741
+ }
742
+
743
+ export async function comparePrefabVariantToBase(params) {
744
+ return sendCommand("prefab-asset/compare-variant", params);
745
+ }
746
+
747
+ export async function applyPrefabVariantOverride(params) {
748
+ return sendCommand("prefab-asset/apply-variant-override", params);
749
+ }
750
+
751
+ export async function revertPrefabVariantOverride(params) {
752
+ return sendCommand("prefab-asset/revert-variant-override", params);
753
+ }
754
+
755
+ export async function transferPrefabVariantOverrides(params) {
756
+ return sendCommand("prefab-asset/transfer-variant-overrides", params);
757
+ }
758
+
759
+ // â"€â"€â"€ Physics â"€â"€â"€
760
+
761
+ export async function physicsRaycast(params) {
762
+ return sendCommand("physics/raycast", params);
763
+ }
764
+
765
+ export async function physicsOverlapSphere(params) {
766
+ return sendCommand("physics/overlap-sphere", params);
767
+ }
768
+
769
+ export async function physicsOverlapBox(params) {
770
+ return sendCommand("physics/overlap-box", params);
771
+ }
772
+
773
+ export async function getCollisionMatrix(params) {
774
+ return sendCommand("physics/collision-matrix", params);
775
+ }
776
+
777
+ export async function setCollisionLayer(params) {
778
+ return sendCommand("physics/set-collision-layer", params);
779
+ }
780
+
781
+ export async function setGravity(params) {
782
+ return sendCommand("physics/set-gravity", params);
783
+ }
784
+
785
+ // â"€â"€â"€ Lighting â"€â"€â"€
786
+
787
+ export async function getLightingInfo(params) {
788
+ return sendCommand("lighting/info", params);
789
+ }
790
+
791
+ export async function createLight(params) {
792
+ return sendCommand("lighting/create", params);
793
+ }
794
+
795
+ export async function setEnvironment(params) {
796
+ return sendCommand("lighting/set-environment", params);
797
+ }
798
+
799
+ export async function createReflectionProbe(params) {
800
+ return sendCommand("lighting/create-reflection-probe", params);
801
+ }
802
+
803
+ export async function createLightProbeGroup(params) {
804
+ return sendCommand("lighting/create-light-probe-group", params);
805
+ }
806
+
807
+ // â"€â"€â"€ Audio â"€â"€â"€
808
+
809
+ export async function getAudioInfo(params) {
810
+ return sendCommand("audio/info", params);
811
+ }
812
+
813
+ export async function createAudioSource(params) {
814
+ return sendCommand("audio/create-source", params);
815
+ }
816
+
817
+ export async function setGlobalAudio(params) {
818
+ return sendCommand("audio/set-global", params);
819
+ }
820
+
821
+ // â"€â"€â"€ Tags & Layers â"€â"€â"€
822
+
823
+ export async function getTagsAndLayers(params) {
824
+ return sendCommand("taglayer/info", params);
825
+ }
826
+
827
+ export async function addTag(params) {
828
+ return sendCommand("taglayer/add-tag", params);
829
+ }
830
+
831
+ export async function setTag(params) {
832
+ return sendCommand("taglayer/set-tag", params);
833
+ }
834
+
835
+ export async function setLayer(params) {
836
+ return sendCommand("taglayer/set-layer", params);
837
+ }
838
+
839
+ export async function setStatic(params) {
840
+ return sendCommand("taglayer/set-static", params);
841
+ }
842
+
843
+ // â"€â"€â"€ Selection & Scene View â"€â"€â"€
844
+
845
+ export async function getSelection(params) {
846
+ return sendCommand("selection/get", params);
847
+ }
848
+
849
+ export async function setSelection(params) {
850
+ return sendCommand("selection/set", params);
851
+ }
852
+
853
+ export async function focusSceneView(params) {
854
+ return sendCommand("selection/focus-scene-view", params);
855
+ }
856
+
857
+ export async function findObjectsByType(params) {
858
+ return sendCommand("selection/find-by-type", params);
859
+ }
860
+
861
+ // â"€â"€â"€ Input Actions â"€â"€â"€
862
+
863
+ export async function createInputActions(params) {
864
+ return sendCommand("input/create", params);
865
+ }
866
+
867
+ export async function getInputActionsInfo(params) {
868
+ return sendCommand("input/info", params);
869
+ }
870
+
871
+ export async function addInputActionMap(params) {
872
+ return sendCommand("input/add-map", params);
873
+ }
874
+
875
+ export async function removeInputActionMap(params) {
876
+ return sendCommand("input/remove-map", params);
877
+ }
878
+
879
+ export async function addInputAction(params) {
880
+ return sendCommand("input/add-action", params);
881
+ }
882
+
883
+ export async function removeInputAction(params) {
884
+ return sendCommand("input/remove-action", params);
885
+ }
886
+
887
+ export async function addInputBinding(params) {
888
+ return sendCommand("input/add-binding", params);
889
+ }
890
+
891
+ export async function addInputCompositeBinding(params) {
892
+ return sendCommand("input/add-composite-binding", params);
893
+ }
894
+
895
+ // â"€â"€â"€ Assembly Definitions â"€â"€â"€
896
+
897
+ export async function createAssemblyDef(params) {
898
+ return sendCommand("asmdef/create", params);
899
+ }
900
+
901
+ export async function getAssemblyDefInfo(params) {
902
+ return sendCommand("asmdef/info", params);
903
+ }
904
+
905
+ export async function listAssemblyDefs(params) {
906
+ return sendCommand("asmdef/list", params);
907
+ }
908
+
909
+ export async function addAssemblyDefReferences(params) {
910
+ return sendCommand("asmdef/add-references", params);
911
+ }
912
+
913
+ export async function removeAssemblyDefReferences(params) {
914
+ return sendCommand("asmdef/remove-references", params);
915
+ }
916
+
917
+ export async function setAssemblyDefPlatforms(params) {
918
+ return sendCommand("asmdef/set-platforms", params);
919
+ }
920
+
921
+ export async function updateAssemblyDefSettings(params) {
922
+ return sendCommand("asmdef/update-settings", params);
923
+ }
924
+
925
+ export async function createAssemblyRef(params) {
926
+ return sendCommand("asmdef/create-ref", params);
927
+ }
928
+
929
+ // â"€â"€â"€ Profiler â"€â"€â"€
930
+
931
+ export async function enableProfiler(params) {
932
+ return sendCommand("profiler/enable", params);
933
+ }
934
+
935
+ export async function getRenderingStats(params) {
936
+ return sendCommand("profiler/stats", params);
937
+ }
938
+
939
+ export async function getMemoryInfo(params) {
940
+ return sendCommand("profiler/memory", params);
941
+ }
942
+
943
+ export async function getProfilerFrameData(params) {
944
+ return sendCommand("profiler/frame-data", params);
945
+ }
946
+
947
+ export async function analyzePerformance(params) {
948
+ return sendCommand("profiler/analyze", params);
949
+ }
950
+
951
+ // â"€â"€â"€ Frame Debugger â"€â"€â"€
952
+
953
+ export async function enableFrameDebugger(params) {
954
+ return sendCommand("debugger/enable", params);
955
+ }
956
+
957
+ export async function getFrameDebuggerEvents(params) {
958
+ return sendCommand("debugger/events", params);
959
+ }
960
+
961
+ export async function getFrameDebuggerEventDetails(params) {
962
+ return sendCommand("debugger/event-details", params);
963
+ }
964
+
965
+ // â"€â"€â"€ Memory Profiler â"€â"€â"€
966
+
967
+ export async function getMemoryStatus(params) {
968
+ return sendCommand("profiler/memory-status", params);
969
+ }
970
+
971
+ export async function getMemoryBreakdown(params) {
972
+ return sendCommand("profiler/memory-breakdown", params);
973
+ }
974
+
975
+ export async function getTopMemoryConsumers(params) {
976
+ return sendCommand("profiler/memory-top-assets", params);
977
+ }
978
+
979
+ export async function takeMemorySnapshot(params) {
980
+ return sendCommand("profiler/memory-snapshot", params);
981
+ }
982
+
983
+ // â"€â"€â"€ Shader Graph â"€â"€â"€
984
+
985
+ export async function getShaderGraphStatus(params) {
986
+ return sendCommand("shadergraph/status", params);
987
+ }
988
+
989
+ export async function listShaders(params) {
990
+ return sendCommand("shadergraph/list-shaders", params);
991
+ }
992
+
993
+ export async function listShaderGraphs(params) {
994
+ return sendCommand("shadergraph/list", params);
995
+ }
996
+
997
+ export async function getShaderGraphInfo(params) {
998
+ return sendCommand("shadergraph/info", params);
999
+ }
1000
+
1001
+ export async function getShaderProperties(params) {
1002
+ return sendCommand("shadergraph/get-properties", params);
1003
+ }
1004
+
1005
+ export async function createShaderGraph(params) {
1006
+ return sendCommand("shadergraph/create", params);
1007
+ }
1008
+
1009
+ export async function openShaderGraph(params) {
1010
+ return sendCommand("shadergraph/open", params);
1011
+ }
1012
+
1013
+ export async function listSubGraphs(params) {
1014
+ return sendCommand("shadergraph/list-subgraphs", params);
1015
+ }
1016
+
1017
+ export async function listVFXGraphs(params) {
1018
+ return sendCommand("shadergraph/list-vfx", params);
1019
+ }
1020
+
1021
+ export async function openVFXGraph(params) {
1022
+ return sendCommand("shadergraph/open-vfx", params);
1023
+ }
1024
+
1025
+ export async function getShaderGraphNodes(params) {
1026
+ return sendCommand("shadergraph/get-nodes", params);
1027
+ }
1028
+
1029
+ export async function getShaderGraphEdges(params) {
1030
+ return sendCommand("shadergraph/get-edges", params);
1031
+ }
1032
+
1033
+ export async function addShaderGraphNode(params) {
1034
+ return sendCommand("shadergraph/add-node", params);
1035
+ }
1036
+
1037
+ export async function removeShaderGraphNode(params) {
1038
+ return sendCommand("shadergraph/remove-node", params);
1039
+ }
1040
+
1041
+ export async function connectShaderGraphNodes(params) {
1042
+ return sendCommand("shadergraph/connect", params);
1043
+ }
1044
+
1045
+ export async function disconnectShaderGraphNodes(params) {
1046
+ return sendCommand("shadergraph/disconnect", params);
1047
+ }
1048
+
1049
+ export async function setShaderGraphNodeProperty(params) {
1050
+ return sendCommand("shadergraph/set-node-property", params);
1051
+ }
1052
+
1053
+ export async function getShaderGraphNodeTypes(params) {
1054
+ return sendCommand("shadergraph/get-node-types", params);
1055
+ }
1056
+
1057
+ // â"€â"€â"€ Amplify Shader Editor â"€â"€â"€
1058
+
1059
+ export async function getAmplifyStatus(params) {
1060
+ return sendCommand("amplify/status", params);
1061
+ }
1062
+
1063
+ export async function listAmplifyShaders(params) {
1064
+ return sendCommand("amplify/list", params);
1065
+ }
1066
+
1067
+ export async function getAmplifyShaderInfo(params) {
1068
+ return sendCommand("amplify/info", params);
1069
+ }
1070
+
1071
+ export async function openAmplifyShader(params) {
1072
+ return sendCommand("amplify/open", params);
1073
+ }
1074
+
1075
+ export async function listAmplifyFunctions(params) {
1076
+ return sendCommand("amplify/list-functions", params);
1077
+ }
1078
+
1079
+ export async function getAmplifyNodeTypes(params) {
1080
+ return sendCommand("amplify/get-node-types", params);
1081
+ }
1082
+
1083
+ export async function getAmplifyGraphNodes(params) {
1084
+ return sendCommand("amplify/get-nodes", params);
1085
+ }
1086
+
1087
+ export async function getAmplifyGraphConnections(params) {
1088
+ return sendCommand("amplify/get-connections", params);
1089
+ }
1090
+
1091
+ export async function createAmplifyShader(params) {
1092
+ return sendCommand("amplify/create-shader", params);
1093
+ }
1094
+
1095
+ export async function addAmplifyNode(params) {
1096
+ return sendCommand("amplify/add-node", params);
1097
+ }
1098
+
1099
+ export async function removeAmplifyNode(params) {
1100
+ return sendCommand("amplify/remove-node", params);
1101
+ }
1102
+
1103
+ export async function connectAmplifyNodes(params) {
1104
+ return sendCommand("amplify/connect", params);
1105
+ }
1106
+
1107
+ export async function disconnectAmplifyNodes(params) {
1108
+ return sendCommand("amplify/disconnect", params);
1109
+ }
1110
+
1111
+ export async function getAmplifyNodeInfo(params) {
1112
+ return sendCommand("amplify/node-info", params);
1113
+ }
1114
+
1115
+ export async function setAmplifyNodeProperty(params) {
1116
+ return sendCommand("amplify/set-node-property", params);
1117
+ }
1118
+
1119
+ export async function moveAmplifyNode(params) {
1120
+ return sendCommand("amplify/move-node", params);
1121
+ }
1122
+
1123
+ export async function saveAmplifyGraph(params) {
1124
+ return sendCommand("amplify/save", params);
1125
+ }
1126
+
1127
+ export async function closeAmplifyEditor(params) {
1128
+ return sendCommand("amplify/close", params);
1129
+ }
1130
+
1131
+ export async function createAmplifyFromTemplate(params) {
1132
+ return sendCommand("amplify/create-from-template", params);
1133
+ }
1134
+
1135
+ export async function focusAmplifyNode(params) {
1136
+ return sendCommand("amplify/focus-node", params);
1137
+ }
1138
+
1139
+ export async function getAmplifyMasterNodeInfo(params) {
1140
+ return sendCommand("amplify/master-node-info", params);
1141
+ }
1142
+
1143
+ export async function disconnectAllAmplifyNode(params) {
1144
+ return sendCommand("amplify/disconnect-all", params);
1145
+ }
1146
+
1147
+ export async function duplicateAmplifyNode(params) {
1148
+ return sendCommand("amplify/duplicate-node", params);
1149
+ }
1150
+
1151
+ // â"€â"€â"€ Agent Management â"€â"€â"€
1152
+
1153
+ export async function listAgents(params) {
1154
+ return sendCommand("agents/list", params);
1155
+ }
1156
+
1157
+ export async function getAgentLog(params) {
1158
+ return sendCommand("agents/log", params);
1159
+ }
1160
+
1161
+ // â"€â"€â"€ Search â"€â"€â"€
1162
+
1163
+ export async function findByComponent(params) {
1164
+ return sendCommand("search/by-component", params);
1165
+ }
1166
+
1167
+ export async function findByTag(params) {
1168
+ return sendCommand("search/by-tag", params);
1169
+ }
1170
+
1171
+ export async function findByLayer(params) {
1172
+ return sendCommand("search/by-layer", params);
1173
+ }
1174
+
1175
+ export async function findByName(params) {
1176
+ return sendCommand("search/by-name", params);
1177
+ }
1178
+
1179
+ export async function findByShader(params) {
1180
+ return sendCommand("search/by-shader", params);
1181
+ }
1182
+
1183
+ export async function searchAssets(params) {
1184
+ return sendCommand("search/assets", params);
1185
+ }
1186
+
1187
+ export async function findMissingReferences(params) {
1188
+ return sendCommand("search/missing-references", params);
1189
+ }
1190
+
1191
+ export async function getSceneStats(params) {
1192
+ return sendCommand("search/scene-stats", params);
1193
+ }
1194
+
1195
+ // â"€â"€â"€ Project Settings â"€â"€â"€
1196
+
1197
+ export async function getQualitySettings(params) {
1198
+ return sendCommand("settings/quality", params);
1199
+ }
1200
+
1201
+ export async function setQualityLevel(params) {
1202
+ return sendCommand("settings/quality-level", params);
1203
+ }
1204
+
1205
+ export async function getPhysicsSettings(params) {
1206
+ return sendCommand("settings/physics", params);
1207
+ }
1208
+
1209
+ export async function setPhysicsSettings(params) {
1210
+ return sendCommand("settings/set-physics", params);
1211
+ }
1212
+
1213
+ export async function getTimeSettings(params) {
1214
+ return sendCommand("settings/time", params);
1215
+ }
1216
+
1217
+ export async function setTimeSettings(params) {
1218
+ return sendCommand("settings/set-time", params);
1219
+ }
1220
+
1221
+ export async function getPlayerSettings(params) {
1222
+ return sendCommand("settings/player", params);
1223
+ }
1224
+
1225
+ export async function setPlayerSettings(params) {
1226
+ return sendCommand("settings/set-player", params);
1227
+ }
1228
+
1229
+ export async function getRenderPipelineInfo(params) {
1230
+ return sendCommand("settings/render-pipeline", params);
1231
+ }
1232
+
1233
+ // â"€â"€â"€ Undo â"€â"€â"€
1234
+
1235
+ export async function performUndo(params) {
1236
+ return sendCommand("undo/perform", params);
1237
+ }
1238
+
1239
+ export async function performRedo(params) {
1240
+ return sendCommand("undo/redo", params);
1241
+ }
1242
+
1243
+ export async function getUndoHistory(params) {
1244
+ return sendCommand("undo/history", params);
1245
+ }
1246
+
1247
+ export async function clearUndo(params) {
1248
+ return sendCommand("undo/clear", params);
1249
+ }
1250
+
1251
+ // â"€â"€â"€ Screenshot / Scene View â"€â"€â"€
1252
+
1253
+ export async function captureGameView(params) {
1254
+ return sendCommand("screenshot/game", params);
1255
+ }
1256
+
1257
+ export async function captureSceneView(params) {
1258
+ return sendCommand("screenshot/scene", params);
1259
+ }
1260
+
1261
+ export async function captureEditorWindow(params) {
1262
+ return sendCommand("screenshot/editor-window", params);
1263
+ }
1264
+
1265
+ export async function getSceneViewInfo(params) {
1266
+ return sendCommand("sceneview/info", params);
1267
+ }
1268
+
1269
+ export async function setSceneViewCamera(params) {
1270
+ return sendCommand("sceneview/set-camera", params);
1271
+ }
1272
+
1273
+ // â"€â"€â"€ Graphics & Visuals â"€â"€â"€
1274
+
1275
+ export async function captureAssetPreview(params) {
1276
+ return sendCommand("graphics/asset-preview", params);
1277
+ }
1278
+
1279
+ export async function captureSceneViewGraphics(params) {
1280
+ return sendCommand("graphics/scene-capture", params);
1281
+ }
1282
+
1283
+ export async function captureGameViewGraphics(params) {
1284
+ return sendCommand("graphics/game-capture", params);
1285
+ }
1286
+
1287
+ export async function renderPrefabPreview(params) {
1288
+ return sendCommand("graphics/prefab-render", params);
1289
+ }
1290
+
1291
+ export async function getMeshInfo(params) {
1292
+ return sendCommand("graphics/mesh-info", params);
1293
+ }
1294
+
1295
+ export async function getMaterialInfo(params) {
1296
+ return sendCommand("graphics/material-info", params);
1297
+ }
1298
+
1299
+ export async function getTextureInfoGraphics(params) {
1300
+ return sendCommand("graphics/texture-info", params);
1301
+ }
1302
+
1303
+ export async function getRendererInfo(params) {
1304
+ return sendCommand("graphics/renderer-info", params);
1305
+ }
1306
+
1307
+ export async function getLightingSummary(params) {
1308
+ return sendCommand("graphics/lighting-summary", params);
1309
+ }
1310
+
1311
+ // â"€â"€â"€ Terrain â"€â"€â"€
1312
+
1313
+ export async function createTerrain(params) {
1314
+ return sendCommand("terrain/create", params);
1315
+ }
1316
+
1317
+ export async function getTerrainInfo(params) {
1318
+ return sendCommand("terrain/info", params);
1319
+ }
1320
+
1321
+ export async function setTerrainHeight(params) {
1322
+ return sendCommand("terrain/set-height", params);
1323
+ }
1324
+
1325
+ export async function flattenTerrain(params) {
1326
+ return sendCommand("terrain/flatten", params);
1327
+ }
1328
+
1329
+ export async function addTerrainLayer(params) {
1330
+ return sendCommand("terrain/add-layer", params);
1331
+ }
1332
+
1333
+ export async function getTerrainHeight(params) {
1334
+ return sendCommand("terrain/get-height", params);
1335
+ }
1336
+
1337
+ export async function listTerrains(params) {
1338
+ return sendCommand("terrain/list", params);
1339
+ }
1340
+
1341
+ export async function raiseLowerTerrainHeight(params) {
1342
+ return sendCommand("terrain/raise-lower", params);
1343
+ }
1344
+
1345
+ export async function smoothTerrainHeight(params) {
1346
+ return sendCommand("terrain/smooth", params);
1347
+ }
1348
+
1349
+ export async function setTerrainNoise(params) {
1350
+ return sendCommand("terrain/noise", params);
1351
+ }
1352
+
1353
+ export async function setTerrainHeightsRegion(params) {
1354
+ return sendCommand("terrain/set-heights-region", params);
1355
+ }
1356
+
1357
+ export async function getTerrainHeightsRegion(params) {
1358
+ return sendCommand("terrain/get-heights-region", params);
1359
+ }
1360
+
1361
+ export async function removeTerrainLayer(params) {
1362
+ return sendCommand("terrain/remove-layer", params);
1363
+ }
1364
+
1365
+ export async function paintTerrainLayer(params) {
1366
+ return sendCommand("terrain/paint-layer", params);
1367
+ }
1368
+
1369
+ export async function fillTerrainLayer(params) {
1370
+ return sendCommand("terrain/fill-layer", params);
1371
+ }
1372
+
1373
+ export async function addTerrainTreePrototype(params) {
1374
+ return sendCommand("terrain/add-tree-prototype", params);
1375
+ }
1376
+
1377
+ export async function removeTerrainTreePrototype(params) {
1378
+ return sendCommand("terrain/remove-tree-prototype", params);
1379
+ }
1380
+
1381
+ export async function placeTerrainTrees(params) {
1382
+ return sendCommand("terrain/place-trees", params);
1383
+ }
1384
+
1385
+ export async function clearTerrainTrees(params) {
1386
+ return sendCommand("terrain/clear-trees", params);
1387
+ }
1388
+
1389
+ export async function getTerrainTreeInstances(params) {
1390
+ return sendCommand("terrain/get-tree-instances", params);
1391
+ }
1392
+
1393
+ export async function addTerrainDetailPrototype(params) {
1394
+ return sendCommand("terrain/add-detail-prototype", params);
1395
+ }
1396
+
1397
+ export async function paintTerrainDetail(params) {
1398
+ return sendCommand("terrain/paint-detail", params);
1399
+ }
1400
+
1401
+ export async function scatterTerrainDetail(params) {
1402
+ return sendCommand("terrain/scatter-detail", params);
1403
+ }
1404
+
1405
+ export async function clearTerrainDetail(params) {
1406
+ return sendCommand("terrain/clear-detail", params);
1407
+ }
1408
+
1409
+ export async function setTerrainHoles(params) {
1410
+ return sendCommand("terrain/set-holes", params);
1411
+ }
1412
+
1413
+ export async function setTerrainSettings(params) {
1414
+ return sendCommand("terrain/set-settings", params);
1415
+ }
1416
+
1417
+ export async function resizeTerrain(params) {
1418
+ return sendCommand("terrain/resize", params);
1419
+ }
1420
+
1421
+ export async function createTerrainGrid(params) {
1422
+ return sendCommand("terrain/create-grid", params);
1423
+ }
1424
+
1425
+ export async function setTerrainNeighbors(params) {
1426
+ return sendCommand("terrain/set-neighbors", params);
1427
+ }
1428
+
1429
+ export async function importTerrainHeightmap(params) {
1430
+ return sendCommand("terrain/import-heightmap", params);
1431
+ }
1432
+
1433
+ export async function exportTerrainHeightmap(params) {
1434
+ return sendCommand("terrain/export-heightmap", params);
1435
+ }
1436
+
1437
+ export async function getTerrainSteepness(params) {
1438
+ return sendCommand("terrain/get-steepness", params);
1439
+ }
1440
+
1441
+ // â"€â"€â"€ Particle System â"€â"€â"€
1442
+
1443
+ export async function createParticleSystem(params) {
1444
+ return sendCommand("particle/create", params);
1445
+ }
1446
+
1447
+ export async function getParticleSystemInfo(params) {
1448
+ return sendCommand("particle/info", params);
1449
+ }
1450
+
1451
+ export async function setParticleMainModule(params) {
1452
+ return sendCommand("particle/set-main", params);
1453
+ }
1454
+
1455
+ export async function setParticleEmission(params) {
1456
+ return sendCommand("particle/set-emission", params);
1457
+ }
1458
+
1459
+ export async function setParticleShape(params) {
1460
+ return sendCommand("particle/set-shape", params);
1461
+ }
1462
+
1463
+ export async function particlePlayback(params) {
1464
+ return sendCommand("particle/playback", params);
1465
+ }
1466
+
1467
+ // â"€â"€â"€ ScriptableObject â"€â"€â"€
1468
+
1469
+ export async function createScriptableObject(params) {
1470
+ return sendCommand("scriptableobject/create", params);
1471
+ }
1472
+
1473
+ export async function getScriptableObjectInfo(params) {
1474
+ return sendCommand("scriptableobject/info", params);
1475
+ }
1476
+
1477
+ export async function setScriptableObjectField(params) {
1478
+ return sendCommand("scriptableobject/set-field", params);
1479
+ }
1480
+
1481
+ export async function listScriptableObjectTypes(params) {
1482
+ return sendCommand("scriptableobject/list-types", params);
1483
+ }
1484
+
1485
+ // â"€â"€â"€ Texture â"€â"€â"€
1486
+
1487
+ export async function getTextureInfo(params) {
1488
+ return sendCommand("texture/info", params);
1489
+ }
1490
+
1491
+ export async function setTextureImportSettings(params) {
1492
+ return sendCommand("texture/set-import", params);
1493
+ }
1494
+
1495
+ export async function reimportTexture(params) {
1496
+ return sendCommand("texture/reimport", params);
1497
+ }
1498
+
1499
+ export async function setTextureAsSprite(params) {
1500
+ return sendCommand("texture/set-sprite", params);
1501
+ }
1502
+
1503
+ export async function setTextureAsNormalMap(params) {
1504
+ return sendCommand("texture/set-normalmap", params);
1505
+ }
1506
+
1507
+ // ─── Sprite Atlas ───
1508
+
1509
+ export async function createSpriteAtlas(params) {
1510
+ return sendCommand("spriteatlas/create", params);
1511
+ }
1512
+
1513
+ export async function getSpriteAtlasInfo(params) {
1514
+ return sendCommand("spriteatlas/info", params);
1515
+ }
1516
+
1517
+ export async function addToSpriteAtlas(params) {
1518
+ return sendCommand("spriteatlas/add", params);
1519
+ }
1520
+
1521
+ export async function removeFromSpriteAtlas(params) {
1522
+ return sendCommand("spriteatlas/remove", params);
1523
+ }
1524
+
1525
+ export async function setSpriteAtlasSettings(params) {
1526
+ return sendCommand("spriteatlas/settings", params);
1527
+ }
1528
+
1529
+ export async function deleteSpriteAtlas(params) {
1530
+ return sendCommand("spriteatlas/delete", params);
1531
+ }
1532
+
1533
+ export async function listSpriteAtlases(params) {
1534
+ return sendCommand("spriteatlas/list", params);
1535
+ }
1536
+
1537
+ // ─── Navigation ───
1538
+
1539
+ export async function bakeNavMesh(params) {
1540
+ return sendCommand("navigation/bake", params);
1541
+ }
1542
+
1543
+ export async function clearNavMesh(params) {
1544
+ return sendCommand("navigation/clear", params);
1545
+ }
1546
+
1547
+ export async function addNavMeshAgent(params) {
1548
+ return sendCommand("navigation/add-agent", params);
1549
+ }
1550
+
1551
+ export async function addNavMeshObstacle(params) {
1552
+ return sendCommand("navigation/add-obstacle", params);
1553
+ }
1554
+
1555
+ export async function getNavMeshInfo(params) {
1556
+ return sendCommand("navigation/info", params);
1557
+ }
1558
+
1559
+ export async function setAgentDestination(params) {
1560
+ return sendCommand("navigation/set-destination", params);
1561
+ }
1562
+
1563
+ // â"€â"€â"€ UI â"€â"€â"€
1564
+
1565
+ export async function createCanvas(params) {
1566
+ return sendCommand("ui/create-canvas", params);
1567
+ }
1568
+
1569
+ export async function createUIElement(params) {
1570
+ return sendCommand("ui/create-element", params);
1571
+ }
1572
+
1573
+ export async function getUIInfo(params) {
1574
+ return sendCommand("ui/info", params);
1575
+ }
1576
+
1577
+ export async function setUIText(params) {
1578
+ return sendCommand("ui/set-text", params);
1579
+ }
1580
+
1581
+ export async function setUIImage(params) {
1582
+ return sendCommand("ui/set-image", params);
1583
+ }
1584
+
1585
+ // â"€â"€â"€ Package Manager â"€â"€â"€
1586
+
1587
+ export async function listPackages(params) {
1588
+ return sendCommand("packages/list", params);
1589
+ }
1590
+
1591
+ export async function addPackage(params) {
1592
+ return sendCommand("packages/add", params);
1593
+ }
1594
+
1595
+ export async function removePackage(params) {
1596
+ return sendCommand("packages/remove", params);
1597
+ }
1598
+
1599
+ export async function searchPackage(params) {
1600
+ return sendCommand("packages/search", params);
1601
+ }
1602
+
1603
+ export async function getPackageInfo(params) {
1604
+ return sendCommand("packages/info", params);
1605
+ }
1606
+
1607
+ // â"€â"€â"€ Constraints & LOD â"€â"€â"€
1608
+
1609
+ export async function addConstraint(params) {
1610
+ return sendCommand("constraint/add", params);
1611
+ }
1612
+
1613
+ export async function getConstraintInfo(params) {
1614
+ return sendCommand("constraint/info", params);
1615
+ }
1616
+
1617
+ export async function createLODGroup(params) {
1618
+ return sendCommand("lod/create", params);
1619
+ }
1620
+
1621
+ export async function getLODGroupInfo(params) {
1622
+ return sendCommand("lod/info", params);
1623
+ }
1624
+
1625
+ // â"€â"€â"€ Prefs â"€â"€â"€
1626
+
1627
+ export async function getEditorPref(params) {
1628
+ return sendCommand("editorprefs/get", params);
1629
+ }
1630
+
1631
+ export async function setEditorPref(params) {
1632
+ return sendCommand("editorprefs/set", params);
1633
+ }
1634
+
1635
+ export async function deleteEditorPref(params) {
1636
+ return sendCommand("editorprefs/delete", params);
1637
+ }
1638
+
1639
+ export async function getPlayerPref(params) {
1640
+ return sendCommand("playerprefs/get", params);
1641
+ }
1642
+
1643
+ export async function setPlayerPref(params) {
1644
+ return sendCommand("playerprefs/set", params);
1645
+ }
1646
+
1647
+ export async function deletePlayerPref(params) {
1648
+ return sendCommand("playerprefs/delete", params);
1649
+ }
1650
+
1651
+ export async function deleteAllPlayerPrefs(params) {
1652
+ return sendCommand("playerprefs/delete-all", params);
1653
+ }
1654
+
1655
+ // â"€â"€â"€ Project Context (direct HTTP, no queue) â"€â"€â"€
1656
+
1657
+ /**
1658
+ * Get project context files. Bypasses the command queue since it's read-only file I/O.
1659
+ * @param {string} [category] - Optional specific category to fetch. Omit for all.
1660
+ * @returns {object} Context data with categories and content.
1661
+ */
1662
+ export async function getProjectContext(category = null) {
1663
+ const url = category
1664
+ ? `${getBridgeUrl()}/api/context/${encodeURIComponent(category)}`
1665
+ : `${getBridgeUrl()}/api/context`;
1666
+
1667
+ const response = await fetch(url, {
1668
+ method: "GET",
1669
+ headers: { "X-Agent-Id": _currentAgentId },
1670
+ signal: AbortSignal.timeout(5000),
1671
+ });
1672
+
1673
+ if (!response.ok) {
1674
+ throw new Error(`Context request failed: HTTP ${response.status}`);
1675
+ }
1676
+
1677
+ return response.json();
1678
+ }
1679
+
1680
+ // ─── Testing ───
1681
+
1682
+ export async function runTests(params) {
1683
+ return sendCommand("testing/run-tests", params);
1684
+ }
1685
+ export async function getTestJob(params) {
1686
+ return sendCommand("testing/get-job", params);
1687
+ }
1688
+ export async function listTests(params) {
1689
+ return sendCommand("testing/list-tests", params);
1690
+ }