@beremaran/godot-agent-loop 1.0.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 (70) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +925 -0
  3. package/addons/godot_agent_loop/LICENSE +23 -0
  4. package/addons/godot_agent_loop/README.md +31 -0
  5. package/addons/godot_agent_loop/plugin.cfg +8 -0
  6. package/addons/godot_agent_loop/plugin.gd +417 -0
  7. package/agent-plugin/.claude-plugin/plugin.json +19 -0
  8. package/agent-plugin/.codex-plugin/plugin.json +37 -0
  9. package/agent-plugin/.mcp.json +14 -0
  10. package/agent-plugin/adapter-manifest.json +45 -0
  11. package/agent-plugin/pi/extension.ts +136 -0
  12. package/agent-plugin/skills/build-godot-game/SKILL.md +41 -0
  13. package/agent-plugin/skills/debug-godot-game/SKILL.md +37 -0
  14. package/agent-plugin/skills/ship-godot-game/SKILL.md +46 -0
  15. package/agent-plugin/skills/ship-godot-game/agents/openai.yaml +4 -0
  16. package/agent-plugin/skills/verify-godot-change/SKILL.md +35 -0
  17. package/build/authoring-session-manager.js +237 -0
  18. package/build/domain-tool-registries.js +207 -0
  19. package/build/editor-bridge-protocol.js +1 -0
  20. package/build/editor-connection.js +112 -0
  21. package/build/editor-mutation-guard.js +30 -0
  22. package/build/editor-plugin-installer.js +220 -0
  23. package/build/engine-api/extension_api-4.7.stable.official.5b4e0cb0f.json +356830 -0
  24. package/build/game-command-service.js +49 -0
  25. package/build/game-connection.js +337 -0
  26. package/build/godot-executable.js +156 -0
  27. package/build/godot-process-manager.js +112 -0
  28. package/build/godot-subprocess.js +23 -0
  29. package/build/headless-operation-runner.js +68 -0
  30. package/build/headless-operation-service.js +65 -0
  31. package/build/index.js +478 -0
  32. package/build/interaction-server-installer.js +234 -0
  33. package/build/opencode-setup.js +199 -0
  34. package/build/project-support.js +219 -0
  35. package/build/runtime-protocol.js +202 -0
  36. package/build/scripts/godot_operations.gd +1534 -0
  37. package/build/scripts/mcp_editor_plugin.gd +417 -0
  38. package/build/scripts/mcp_interaction_server.gd +1255 -0
  39. package/build/scripts/mcp_runtime/audio_animation_domain.gd +568 -0
  40. package/build/scripts/mcp_runtime/command_params.gd +339 -0
  41. package/build/scripts/mcp_runtime/core_domain.gd +591 -0
  42. package/build/scripts/mcp_runtime/input_domain.gd +695 -0
  43. package/build/scripts/mcp_runtime/networking_domain.gd +356 -0
  44. package/build/scripts/mcp_runtime/physics_domain.gd +653 -0
  45. package/build/scripts/mcp_runtime/privileged_command_policy.gd +81 -0
  46. package/build/scripts/mcp_runtime/rendering_domain.gd +807 -0
  47. package/build/scripts/mcp_runtime/runtime_domain.gd +108 -0
  48. package/build/scripts/mcp_runtime/scene_2d_domain.gd +527 -0
  49. package/build/scripts/mcp_runtime/scene_3d_domain.gd +573 -0
  50. package/build/scripts/mcp_runtime/system_domain.gd +277 -0
  51. package/build/scripts/mcp_runtime/ui_domain.gd +619 -0
  52. package/build/scripts/mcp_runtime/variant_codec.gd +335 -0
  53. package/build/scripts/validate_script.gd +28 -0
  54. package/build/server-instructions.js +11 -0
  55. package/build/session-timing.js +20 -0
  56. package/build/tool-argument-validation.js +120 -0
  57. package/build/tool-definitions.js +2727 -0
  58. package/build/tool-handlers/game-tool-handlers.js +1345 -0
  59. package/build/tool-handlers/lifecycle-tool-handlers.js +346 -0
  60. package/build/tool-handlers/project-handler-services.js +1458 -0
  61. package/build/tool-handlers/project-tool-handlers.js +1506 -0
  62. package/build/tool-handlers/visual-regression-service.js +139 -0
  63. package/build/tool-manifest.js +1193 -0
  64. package/build/tool-mutation-policy.js +122 -0
  65. package/build/tool-registry.js +34 -0
  66. package/build/tool-surface.js +70 -0
  67. package/build/utils.js +273 -0
  68. package/package.json +110 -0
  69. package/product.json +52 -0
  70. package/scripts/prepare-package.js +42 -0
@@ -0,0 +1,1193 @@
1
+ /**
2
+ * Machine-readable traceability manifest: one entry per advertised MCP tool.
3
+ * The Record key type makes completeness and uniqueness a compile-time fact,
4
+ * and tests/tool-manifest.test.ts verifies every mapping against the sources.
5
+ */
6
+ export const toolManifest = {
7
+ godot_tools: {
8
+ domain: 'lifecycle',
9
+ handler: 'handleGodotTools',
10
+ backend: { kind: 'local' },
11
+ actions: ['search', 'describe', 'call'],
12
+ privileged: false,
13
+ },
14
+ launch_editor: {
15
+ domain: 'lifecycle',
16
+ handler: 'handleLaunchEditor',
17
+ backend: { kind: 'process' },
18
+ actions: null,
19
+ privileged: false,
20
+ },
21
+ editor_control: {
22
+ domain: 'lifecycle',
23
+ handler: 'handleEditorControl',
24
+ backend: { kind: 'process' },
25
+ actions: ['inspect', 'select', 'save', 'reload', 'open_scene', 'set_property', 'rename_node', 'undo', 'redo'],
26
+ privileged: false,
27
+ },
28
+ run_project: {
29
+ domain: 'lifecycle',
30
+ handler: 'handleRunProject',
31
+ backend: { kind: 'process' },
32
+ actions: null,
33
+ privileged: false,
34
+ },
35
+ verify_project: {
36
+ domain: 'lifecycle',
37
+ handler: 'handleVerifyProject',
38
+ backend: { kind: 'process' },
39
+ actions: null,
40
+ privileged: false,
41
+ },
42
+ run_project_tests: {
43
+ domain: 'project',
44
+ handler: 'handleRunProjectTests',
45
+ backend: { kind: 'godot-cli' },
46
+ actions: ['discover', 'run'],
47
+ privileged: false,
48
+ },
49
+ manage_import_pipeline: {
50
+ domain: 'project',
51
+ handler: 'handleManageImportPipeline',
52
+ backend: { kind: 'godot-cli' },
53
+ actions: ['inspect', 'change', 'reimport', 'dependencies'],
54
+ privileged: false,
55
+ },
56
+ analyze_project_integrity: {
57
+ domain: 'project',
58
+ handler: 'handleAnalyzeProjectIntegrity',
59
+ backend: { kind: 'local' },
60
+ actions: ['analyze', 'preview_rename', 'assets', 'localization', 'accessibility', 'extensions', 'leaks'],
61
+ privileged: false,
62
+ },
63
+ verify_export_readiness: {
64
+ domain: 'project',
65
+ handler: 'handleVerifyExportReadiness',
66
+ backend: { kind: 'godot-cli' },
67
+ actions: ['inspect', 'export_smoke'],
68
+ privileged: false,
69
+ },
70
+ verify_dotnet_project: {
71
+ domain: 'project',
72
+ handler: 'handleVerifyDotnetProject',
73
+ backend: { kind: 'godot-cli' },
74
+ actions: ['inspect', 'restore', 'build', 'run'],
75
+ privileged: false,
76
+ },
77
+ manage_addon: {
78
+ domain: 'project',
79
+ handler: 'handleManageAddon',
80
+ backend: { kind: 'godot-cli' },
81
+ actions: ['inspect', 'install', 'update', 'remove', 'enable', 'disable'],
82
+ privileged: false,
83
+ },
84
+ get_debug_output: {
85
+ domain: 'lifecycle',
86
+ handler: 'handleGetDebugOutput',
87
+ backend: { kind: 'process' },
88
+ actions: null,
89
+ privileged: false,
90
+ },
91
+ stop_project: {
92
+ domain: 'lifecycle',
93
+ handler: 'handleStopProject',
94
+ backend: { kind: 'process' },
95
+ actions: null,
96
+ privileged: false,
97
+ },
98
+ get_godot_version: {
99
+ domain: 'lifecycle',
100
+ handler: 'handleGetGodotVersion',
101
+ backend: { kind: 'process' },
102
+ actions: null,
103
+ privileged: false,
104
+ },
105
+ list_projects: {
106
+ domain: 'project',
107
+ handler: 'handleListProjects',
108
+ backend: { kind: 'local' },
109
+ actions: null,
110
+ privileged: false,
111
+ },
112
+ get_project_info: {
113
+ domain: 'project',
114
+ handler: 'handleGetProjectInfo',
115
+ backend: { kind: 'godot-cli' },
116
+ actions: null,
117
+ privileged: false,
118
+ },
119
+ create_scene: {
120
+ domain: 'project',
121
+ handler: 'handleCreateScene',
122
+ backend: { kind: 'authoring-session', command: 'authoring_create_scene', fallback: { kind: 'subprocess', operation: 'create_scene' } },
123
+ actions: null,
124
+ privileged: false,
125
+ },
126
+ add_node: {
127
+ domain: 'project',
128
+ handler: 'handleAddNode',
129
+ backend: { kind: 'authoring-session', command: 'authoring_add_node', fallback: { kind: 'subprocess', operation: 'add_node' } },
130
+ actions: null,
131
+ privileged: false,
132
+ },
133
+ load_sprite: {
134
+ domain: 'project',
135
+ handler: 'handleLoadSprite',
136
+ backend: { kind: 'authoring-session', command: 'authoring_load_sprite', fallback: { kind: 'subprocess', operation: 'load_sprite' } },
137
+ actions: null,
138
+ privileged: false,
139
+ },
140
+ export_mesh_library: {
141
+ domain: 'project',
142
+ handler: 'handleExportMeshLibrary',
143
+ backend: { kind: 'authoring-session', command: 'authoring_export_mesh_library', fallback: { kind: 'subprocess', operation: 'export_mesh_library' } },
144
+ actions: null,
145
+ privileged: false,
146
+ },
147
+ save_scene: {
148
+ domain: 'project',
149
+ handler: 'handleSaveScene',
150
+ backend: { kind: 'authoring-session', command: 'authoring_save_scene', fallback: { kind: 'subprocess', operation: 'save_scene' } },
151
+ actions: null,
152
+ privileged: false,
153
+ },
154
+ get_uid: {
155
+ domain: 'project',
156
+ handler: 'handleGetUid',
157
+ backend: { kind: 'authoring-session', command: 'authoring_get_uid', fallback: { kind: 'subprocess', operation: 'get_uid' } },
158
+ actions: null,
159
+ privileged: false,
160
+ },
161
+ update_project_uids: {
162
+ domain: 'project',
163
+ handler: 'handleUpdateProjectUids',
164
+ backend: { kind: 'authoring-session', command: 'authoring_resave_resources', fallback: { kind: 'subprocess', operation: 'resave_resources' } },
165
+ actions: null,
166
+ privileged: false,
167
+ },
168
+ game_screenshot: {
169
+ domain: 'game',
170
+ handler: 'handleGameScreenshot',
171
+ backend: { kind: 'runtime', command: 'screenshot' },
172
+ actions: null,
173
+ privileged: false,
174
+ },
175
+ game_visual_regression: {
176
+ domain: 'game',
177
+ handler: 'handleGameVisualRegression',
178
+ backend: { kind: 'local' },
179
+ actions: ['capture_baseline', 'compare'],
180
+ privileged: false,
181
+ },
182
+ game_click: {
183
+ domain: 'game',
184
+ handler: 'handleGameClick',
185
+ backend: { kind: 'runtime', command: 'click' },
186
+ actions: null,
187
+ privileged: false,
188
+ },
189
+ game_key_press: {
190
+ domain: 'game',
191
+ handler: 'handleGameKeyPress',
192
+ backend: { kind: 'runtime', command: 'key_press' },
193
+ actions: null,
194
+ actionParamIsData: true,
195
+ privileged: false,
196
+ },
197
+ game_mouse_move: {
198
+ domain: 'game',
199
+ handler: 'handleGameMouseMove',
200
+ backend: { kind: 'runtime', command: 'mouse_move' },
201
+ actions: null,
202
+ privileged: false,
203
+ },
204
+ game_get_ui: {
205
+ domain: 'game',
206
+ handler: 'handleGameGetUi',
207
+ backend: { kind: 'runtime', command: 'get_ui_elements' },
208
+ actions: null,
209
+ privileged: false,
210
+ },
211
+ game_get_scene_tree: {
212
+ domain: 'game',
213
+ handler: 'handleGameGetSceneTree',
214
+ backend: { kind: 'runtime', command: 'get_scene_tree' },
215
+ actions: null,
216
+ privileged: false,
217
+ },
218
+ game_eval: {
219
+ domain: 'game',
220
+ handler: 'handleGameEval',
221
+ backend: { kind: 'runtime', command: 'eval' },
222
+ actions: null,
223
+ privileged: true,
224
+ },
225
+ game_get_property: {
226
+ domain: 'game',
227
+ handler: 'handleGameGetProperty',
228
+ backend: { kind: 'runtime', command: 'get_property' },
229
+ actions: null,
230
+ privileged: true,
231
+ },
232
+ game_set_property: {
233
+ domain: 'game',
234
+ handler: 'handleGameSetProperty',
235
+ backend: { kind: 'runtime', command: 'set_property' },
236
+ actions: null,
237
+ privileged: true,
238
+ },
239
+ game_call_method: {
240
+ domain: 'game',
241
+ handler: 'handleGameCallMethod',
242
+ backend: { kind: 'runtime', command: 'call_method' },
243
+ actions: null,
244
+ privileged: true,
245
+ },
246
+ game_get_node_info: {
247
+ domain: 'game',
248
+ handler: 'handleGameGetNodeInfo',
249
+ backend: { kind: 'runtime', command: 'get_node_info' },
250
+ actions: null,
251
+ privileged: false,
252
+ },
253
+ game_instantiate_scene: {
254
+ domain: 'game',
255
+ handler: 'handleGameInstantiateScene',
256
+ backend: { kind: 'runtime', command: 'instantiate_scene' },
257
+ actions: null,
258
+ privileged: false,
259
+ },
260
+ game_remove_node: {
261
+ domain: 'game',
262
+ handler: 'handleGameRemoveNode',
263
+ backend: { kind: 'runtime', command: 'remove_node' },
264
+ actions: null,
265
+ privileged: false,
266
+ },
267
+ game_change_scene: {
268
+ domain: 'game',
269
+ handler: 'handleGameChangeScene',
270
+ backend: { kind: 'runtime', command: 'change_scene' },
271
+ actions: null,
272
+ privileged: false,
273
+ },
274
+ game_pause: {
275
+ domain: 'game',
276
+ handler: 'handleGamePause',
277
+ backend: { kind: 'runtime', command: 'pause' },
278
+ actions: null,
279
+ privileged: false,
280
+ },
281
+ game_performance: {
282
+ domain: 'game',
283
+ handler: 'handleGamePerformance',
284
+ backend: { kind: 'runtime', command: 'get_performance' },
285
+ actions: ['sample', 'start', 'stop', 'report', 'leaks'],
286
+ privileged: false,
287
+ },
288
+ game_wait: {
289
+ domain: 'game',
290
+ handler: 'handleGameWait',
291
+ backend: { kind: 'runtime', command: 'wait' },
292
+ actions: null,
293
+ privileged: false,
294
+ },
295
+ read_scene: {
296
+ domain: 'project',
297
+ handler: 'handleReadScene',
298
+ backend: { kind: 'authoring-session', command: 'authoring_read_scene', fallback: { kind: 'subprocess', operation: 'read_scene' } },
299
+ actions: null,
300
+ privileged: false,
301
+ },
302
+ modify_scene_node: {
303
+ domain: 'project',
304
+ handler: 'handleModifySceneNode',
305
+ backend: { kind: 'authoring-session', command: 'authoring_modify_node', fallback: { kind: 'subprocess', operation: 'modify_node' } },
306
+ actions: null,
307
+ privileged: false,
308
+ },
309
+ remove_scene_node: {
310
+ domain: 'project',
311
+ handler: 'handleRemoveSceneNode',
312
+ backend: { kind: 'authoring-session', command: 'authoring_remove_node', fallback: { kind: 'subprocess', operation: 'remove_node' } },
313
+ actions: null,
314
+ privileged: false,
315
+ },
316
+ read_project_settings: {
317
+ domain: 'project',
318
+ handler: 'handleReadProjectSettings',
319
+ backend: { kind: 'local' },
320
+ actions: null,
321
+ privileged: false,
322
+ },
323
+ modify_project_settings: {
324
+ domain: 'project',
325
+ handler: 'handleModifyProjectSettings',
326
+ backend: { kind: 'local' },
327
+ actions: null,
328
+ privileged: false,
329
+ },
330
+ list_project_files: {
331
+ domain: 'project',
332
+ handler: 'handleListProjectFiles',
333
+ backend: { kind: 'local' },
334
+ actions: null,
335
+ privileged: false,
336
+ },
337
+ game_connect_signal: {
338
+ domain: 'game',
339
+ handler: 'handleGameConnectSignal',
340
+ backend: { kind: 'runtime', command: 'connect_signal' },
341
+ actions: null,
342
+ privileged: false,
343
+ },
344
+ game_disconnect_signal: {
345
+ domain: 'game',
346
+ handler: 'handleGameDisconnectSignal',
347
+ backend: { kind: 'runtime', command: 'disconnect_signal' },
348
+ actions: null,
349
+ privileged: false,
350
+ },
351
+ game_emit_signal: {
352
+ domain: 'game',
353
+ handler: 'handleGameEmitSignal',
354
+ backend: { kind: 'runtime', command: 'emit_signal' },
355
+ actions: null,
356
+ privileged: false,
357
+ },
358
+ game_play_animation: {
359
+ domain: 'game',
360
+ handler: 'handleGamePlayAnimation',
361
+ backend: { kind: 'runtime', command: 'play_animation' },
362
+ actions: ['play', 'stop', 'pause', 'get_list'],
363
+ privileged: false,
364
+ },
365
+ game_tween_property: {
366
+ domain: 'game',
367
+ handler: 'handleGameTweenProperty',
368
+ backend: { kind: 'runtime', command: 'tween_property' },
369
+ actions: null,
370
+ privileged: false,
371
+ },
372
+ game_get_nodes_in_group: {
373
+ domain: 'game',
374
+ handler: 'handleGameGetNodesInGroup',
375
+ backend: { kind: 'runtime', command: 'get_nodes_in_group' },
376
+ actions: null,
377
+ privileged: false,
378
+ },
379
+ game_find_nodes_by_class: {
380
+ domain: 'game',
381
+ handler: 'handleGameFindNodesByClass',
382
+ backend: { kind: 'runtime', command: 'find_nodes_by_class' },
383
+ actions: null,
384
+ privileged: false,
385
+ },
386
+ game_reparent_node: {
387
+ domain: 'game',
388
+ handler: 'handleGameReparentNode',
389
+ backend: { kind: 'runtime', command: 'reparent_node' },
390
+ actions: null,
391
+ privileged: false,
392
+ },
393
+ attach_script: {
394
+ domain: 'project',
395
+ handler: 'handleAttachScript',
396
+ backend: { kind: 'authoring-session', command: 'authoring_attach_script', fallback: { kind: 'subprocess', operation: 'attach_script' } },
397
+ actions: null,
398
+ privileged: false,
399
+ },
400
+ create_resource: {
401
+ domain: 'project',
402
+ handler: 'handleCreateResource',
403
+ backend: { kind: 'authoring-session', command: 'authoring_create_resource', fallback: { kind: 'subprocess', operation: 'create_resource' } },
404
+ actions: null,
405
+ privileged: false,
406
+ },
407
+ read_file: {
408
+ domain: 'project',
409
+ handler: 'handleReadFile',
410
+ backend: { kind: 'local' },
411
+ actions: null,
412
+ privileged: false,
413
+ },
414
+ write_file: {
415
+ domain: 'project',
416
+ handler: 'handleWriteFile',
417
+ backend: { kind: 'local' },
418
+ actions: null,
419
+ privileged: false,
420
+ },
421
+ delete_file: {
422
+ domain: 'project',
423
+ handler: 'handleDeleteFile',
424
+ backend: { kind: 'local' },
425
+ actions: null,
426
+ privileged: false,
427
+ },
428
+ create_directory: {
429
+ domain: 'project',
430
+ handler: 'handleCreateDirectory',
431
+ backend: { kind: 'local' },
432
+ actions: null,
433
+ privileged: false,
434
+ },
435
+ game_get_errors: {
436
+ domain: 'game',
437
+ handler: 'handleGameGetErrors',
438
+ backend: { kind: 'runtime-buffer' },
439
+ actions: null,
440
+ privileged: false,
441
+ },
442
+ game_get_logs: {
443
+ domain: 'game',
444
+ handler: 'handleGameGetLogs',
445
+ backend: { kind: 'runtime-buffer' },
446
+ actions: null,
447
+ privileged: false,
448
+ },
449
+ game_key_hold: {
450
+ domain: 'game',
451
+ handler: 'handleGameKeyHold',
452
+ backend: { kind: 'runtime', command: 'key_hold' },
453
+ actions: null,
454
+ actionParamIsData: true,
455
+ privileged: false,
456
+ },
457
+ game_key_release: {
458
+ domain: 'game',
459
+ handler: 'handleGameKeyRelease',
460
+ backend: { kind: 'runtime', command: 'key_release' },
461
+ actions: null,
462
+ actionParamIsData: true,
463
+ privileged: false,
464
+ },
465
+ game_scroll: {
466
+ domain: 'game',
467
+ handler: 'handleGameScroll',
468
+ backend: { kind: 'runtime', command: 'scroll' },
469
+ actions: null,
470
+ privileged: false,
471
+ },
472
+ game_mouse_drag: {
473
+ domain: 'game',
474
+ handler: 'handleGameMouseDrag',
475
+ backend: { kind: 'runtime', command: 'mouse_drag' },
476
+ actions: null,
477
+ privileged: false,
478
+ },
479
+ game_gamepad: {
480
+ domain: 'game',
481
+ handler: 'handleGameGamepad',
482
+ backend: { kind: 'runtime', command: 'gamepad' },
483
+ actions: null,
484
+ privileged: false,
485
+ },
486
+ create_project: {
487
+ domain: 'project',
488
+ handler: 'handleCreateProject',
489
+ backend: { kind: 'local' },
490
+ actions: null,
491
+ privileged: false,
492
+ },
493
+ create_csharp_script: {
494
+ domain: 'project',
495
+ handler: 'handleCreateCsharpScript',
496
+ backend: { kind: 'local' },
497
+ actions: null,
498
+ privileged: false,
499
+ },
500
+ manage_autoloads: {
501
+ domain: 'project',
502
+ handler: 'handleManageAutoloads',
503
+ backend: { kind: 'local' },
504
+ actions: ['list', 'add', 'remove'],
505
+ privileged: false,
506
+ },
507
+ manage_input_map: {
508
+ domain: 'project',
509
+ handler: 'handleManageInputMap',
510
+ backend: { kind: 'local' },
511
+ actions: ['list', 'add', 'remove'],
512
+ privileged: false,
513
+ },
514
+ manage_export_presets: {
515
+ domain: 'project',
516
+ handler: 'handleManageExportPresets',
517
+ backend: { kind: 'local' },
518
+ actions: ['list', 'add', 'remove'],
519
+ privileged: false,
520
+ },
521
+ game_get_camera: {
522
+ domain: 'game',
523
+ handler: 'handleGameGetCamera',
524
+ backend: { kind: 'runtime', command: 'get_camera' },
525
+ actions: null,
526
+ privileged: false,
527
+ },
528
+ game_set_camera: {
529
+ domain: 'game',
530
+ handler: 'handleGameSetCamera',
531
+ backend: { kind: 'runtime', command: 'set_camera' },
532
+ actions: null,
533
+ privileged: false,
534
+ },
535
+ game_raycast: {
536
+ domain: 'game',
537
+ handler: 'handleGameRaycast',
538
+ backend: { kind: 'runtime', command: 'raycast' },
539
+ actions: null,
540
+ privileged: false,
541
+ },
542
+ game_get_audio: {
543
+ domain: 'game',
544
+ handler: 'handleGameGetAudio',
545
+ backend: { kind: 'runtime', command: 'get_audio' },
546
+ actions: null,
547
+ privileged: false,
548
+ },
549
+ game_spawn_node: {
550
+ domain: 'game',
551
+ handler: 'handleGameSpawnNode',
552
+ backend: { kind: 'runtime', command: 'spawn_node' },
553
+ actions: null,
554
+ privileged: false,
555
+ },
556
+ game_set_shader_param: {
557
+ domain: 'game',
558
+ handler: 'handleGameSetShaderParam',
559
+ backend: { kind: 'runtime', command: 'set_shader_param' },
560
+ actions: null,
561
+ privileged: false,
562
+ },
563
+ game_audio_play: {
564
+ domain: 'game',
565
+ handler: 'handleGameAudioPlay',
566
+ backend: { kind: 'runtime', command: 'audio_play' },
567
+ actions: ['play', 'stop', 'pause', 'resume'],
568
+ privileged: false,
569
+ },
570
+ game_audio_bus: {
571
+ domain: 'game',
572
+ handler: 'handleGameAudioBus',
573
+ backend: { kind: 'runtime', command: 'audio_bus' },
574
+ actions: null,
575
+ privileged: false,
576
+ },
577
+ game_navigate_path: {
578
+ domain: 'game',
579
+ handler: 'handleGameNavigatePath',
580
+ backend: { kind: 'runtime', command: 'navigate_path' },
581
+ actions: null,
582
+ privileged: false,
583
+ },
584
+ game_tilemap: {
585
+ domain: 'game',
586
+ handler: 'handleGameTilemap',
587
+ backend: { kind: 'runtime', command: 'tilemap' },
588
+ actions: ['set_cells', 'get_cell', 'erase_cells', 'get_used_cells'],
589
+ privileged: false,
590
+ },
591
+ game_add_collision: {
592
+ domain: 'game',
593
+ handler: 'handleGameAddCollision',
594
+ backend: { kind: 'runtime', command: 'add_collision' },
595
+ actions: null,
596
+ privileged: false,
597
+ },
598
+ game_environment: {
599
+ domain: 'game',
600
+ handler: 'handleGameEnvironment',
601
+ backend: { kind: 'runtime', command: 'environment' },
602
+ actions: ['get', 'set'],
603
+ privileged: false,
604
+ },
605
+ game_manage_group: {
606
+ domain: 'game',
607
+ handler: 'handleGameManageGroup',
608
+ backend: { kind: 'runtime', command: 'manage_group' },
609
+ actions: ['add', 'remove', 'get_groups'],
610
+ privileged: false,
611
+ },
612
+ game_create_timer: {
613
+ domain: 'game',
614
+ handler: 'handleGameCreateTimer',
615
+ backend: { kind: 'runtime', command: 'create_timer' },
616
+ actions: null,
617
+ privileged: false,
618
+ },
619
+ game_set_particles: {
620
+ domain: 'game',
621
+ handler: 'handleGameSetParticles',
622
+ backend: { kind: 'runtime', command: 'set_particles' },
623
+ actions: null,
624
+ privileged: false,
625
+ },
626
+ game_create_animation: {
627
+ domain: 'game',
628
+ handler: 'handleGameCreateAnimation',
629
+ backend: { kind: 'runtime', command: 'create_animation' },
630
+ actions: null,
631
+ privileged: false,
632
+ },
633
+ export_project: {
634
+ domain: 'project',
635
+ handler: 'handleExportProject',
636
+ backend: { kind: 'godot-cli' },
637
+ actions: null,
638
+ privileged: false,
639
+ },
640
+ game_serialize_state: {
641
+ domain: 'game',
642
+ handler: 'handleGameSerializeState',
643
+ backend: { kind: 'runtime', command: 'serialize_state' },
644
+ actions: ['save', 'load'],
645
+ privileged: false,
646
+ },
647
+ game_physics_body: {
648
+ domain: 'game',
649
+ handler: 'handleGamePhysicsBody',
650
+ backend: { kind: 'runtime', command: 'physics_body' },
651
+ actions: null,
652
+ privileged: false,
653
+ },
654
+ game_create_joint: {
655
+ domain: 'game',
656
+ handler: 'handleGameCreateJoint',
657
+ backend: { kind: 'runtime', command: 'create_joint' },
658
+ actions: null,
659
+ privileged: false,
660
+ },
661
+ game_bone_pose: {
662
+ domain: 'game',
663
+ handler: 'handleGameBonePose',
664
+ backend: { kind: 'runtime', command: 'bone_pose' },
665
+ actions: ['list', 'get', 'set'],
666
+ privileged: false,
667
+ },
668
+ game_ui_theme: {
669
+ domain: 'game',
670
+ handler: 'handleGameUiTheme',
671
+ backend: { kind: 'runtime', command: 'ui_theme' },
672
+ actions: null,
673
+ privileged: false,
674
+ },
675
+ game_viewport: {
676
+ domain: 'game',
677
+ handler: 'handleGameViewport',
678
+ backend: { kind: 'runtime', command: 'viewport' },
679
+ actions: ['create', 'configure', 'get'],
680
+ privileged: false,
681
+ },
682
+ game_debug_draw: {
683
+ domain: 'game',
684
+ handler: 'handleGameDebugDraw',
685
+ backend: { kind: 'runtime', command: 'debug_draw' },
686
+ actions: ['line', 'sphere', 'box', 'clear'],
687
+ privileged: false,
688
+ },
689
+ game_http_request: {
690
+ domain: 'game',
691
+ handler: 'handleGameHttpRequest',
692
+ backend: { kind: 'runtime', command: 'http_request' },
693
+ actions: null,
694
+ privileged: true,
695
+ },
696
+ game_websocket: {
697
+ domain: 'game',
698
+ handler: 'handleGameWebsocket',
699
+ backend: { kind: 'runtime', command: 'websocket' },
700
+ actions: ['connect', 'disconnect', 'send', 'receive', 'status'],
701
+ privileged: true,
702
+ },
703
+ game_multiplayer: {
704
+ domain: 'game',
705
+ handler: 'handleGameMultiplayer',
706
+ backend: { kind: 'runtime', command: 'multiplayer' },
707
+ actions: ['create_server', 'create_client', 'disconnect', 'status'],
708
+ privileged: false,
709
+ },
710
+ game_rpc: {
711
+ domain: 'game',
712
+ handler: 'handleGameRpc',
713
+ backend: { kind: 'runtime', command: 'rpc' },
714
+ actions: ['call', 'configure'],
715
+ privileged: true,
716
+ },
717
+ game_touch: {
718
+ domain: 'game',
719
+ handler: 'handleGameTouch',
720
+ backend: { kind: 'runtime', command: 'touch' },
721
+ actions: ['press', 'release', 'drag'],
722
+ privileged: false,
723
+ },
724
+ game_input_state: {
725
+ domain: 'game',
726
+ handler: 'handleGameInputState',
727
+ backend: { kind: 'runtime', command: 'input_state' },
728
+ actions: ['query', 'warp_mouse', 'set_mouse_mode'],
729
+ privileged: false,
730
+ },
731
+ game_input_action: {
732
+ domain: 'game',
733
+ handler: 'handleGameInputAction',
734
+ backend: { kind: 'runtime', command: 'input_action' },
735
+ actions: ['set_strength', 'add_action', 'remove_action', 'list'],
736
+ privileged: false,
737
+ },
738
+ game_list_signals: {
739
+ domain: 'game',
740
+ handler: 'handleGameListSignals',
741
+ backend: { kind: 'runtime', command: 'list_signals' },
742
+ actions: null,
743
+ privileged: false,
744
+ },
745
+ game_await_signal: {
746
+ domain: 'game',
747
+ handler: 'handleGameAwaitSignal',
748
+ backend: { kind: 'runtime', command: 'await_signal' },
749
+ actions: null,
750
+ privileged: false,
751
+ },
752
+ game_script: {
753
+ domain: 'game',
754
+ handler: 'handleGameScript',
755
+ backend: { kind: 'runtime', command: 'script' },
756
+ actions: ['get_source', 'attach', 'detach'],
757
+ privileged: true,
758
+ },
759
+ game_window: {
760
+ domain: 'game',
761
+ handler: 'handleGameWindow',
762
+ backend: { kind: 'runtime', command: 'window' },
763
+ actions: ['get', 'set'],
764
+ privileged: false,
765
+ },
766
+ game_os_info: {
767
+ domain: 'game',
768
+ handler: 'handleGameOsInfo',
769
+ backend: { kind: 'runtime', command: 'os_info' },
770
+ actions: null,
771
+ privileged: false,
772
+ },
773
+ game_time_scale: {
774
+ domain: 'game',
775
+ handler: 'handleGameTimeScale',
776
+ backend: { kind: 'runtime', command: 'time_scale' },
777
+ actions: ['get', 'set'],
778
+ privileged: false,
779
+ },
780
+ game_process_mode: {
781
+ domain: 'game',
782
+ handler: 'handleGameProcessMode',
783
+ backend: { kind: 'runtime', command: 'process_mode' },
784
+ actions: null,
785
+ privileged: false,
786
+ },
787
+ game_world_settings: {
788
+ domain: 'game',
789
+ handler: 'handleGameWorldSettings',
790
+ backend: { kind: 'runtime', command: 'world_settings' },
791
+ actions: ['get', 'set'],
792
+ privileged: false,
793
+ },
794
+ game_csg: {
795
+ domain: 'game',
796
+ handler: 'handleGameCsg',
797
+ backend: { kind: 'runtime', command: 'csg' },
798
+ actions: ['create', 'configure'],
799
+ privileged: false,
800
+ },
801
+ game_multimesh: {
802
+ domain: 'game',
803
+ handler: 'handleGameMultimesh',
804
+ backend: { kind: 'runtime', command: 'multimesh' },
805
+ actions: ['create', 'set_instance', 'get_info'],
806
+ privileged: false,
807
+ },
808
+ game_procedural_mesh: {
809
+ domain: 'game',
810
+ handler: 'handleGameProceduralMesh',
811
+ backend: { kind: 'runtime', command: 'procedural_mesh' },
812
+ actions: null,
813
+ privileged: false,
814
+ },
815
+ game_light_3d: {
816
+ domain: 'game',
817
+ handler: 'handleGameLight3d',
818
+ backend: { kind: 'runtime', command: 'light_3d' },
819
+ actions: ['create', 'configure'],
820
+ privileged: false,
821
+ },
822
+ game_mesh_instance: {
823
+ domain: 'game',
824
+ handler: 'handleGameMeshInstance',
825
+ backend: { kind: 'runtime', command: 'mesh_instance' },
826
+ actions: null,
827
+ privileged: false,
828
+ },
829
+ game_gridmap: {
830
+ domain: 'game',
831
+ handler: 'handleGameGridmap',
832
+ backend: { kind: 'runtime', command: 'gridmap' },
833
+ actions: ['set_cell', 'get_cell', 'clear', 'get_used'],
834
+ privileged: false,
835
+ },
836
+ game_3d_effects: {
837
+ domain: 'game',
838
+ handler: 'handleGame3dEffects',
839
+ backend: { kind: 'runtime', command: '3d_effects' },
840
+ actions: null,
841
+ privileged: false,
842
+ },
843
+ game_gi: {
844
+ domain: 'game',
845
+ handler: 'handleGameGi',
846
+ backend: { kind: 'runtime', command: 'gi' },
847
+ actions: null,
848
+ privileged: false,
849
+ },
850
+ game_path_3d: {
851
+ domain: 'game',
852
+ handler: 'handleGamePath3d',
853
+ backend: { kind: 'runtime', command: 'path_3d' },
854
+ actions: ['create', 'add_point', 'get_points', 'set_points'],
855
+ privileged: false,
856
+ },
857
+ game_sky: {
858
+ domain: 'game',
859
+ handler: 'handleGameSky',
860
+ backend: { kind: 'runtime', command: 'sky' },
861
+ actions: ['create'],
862
+ privileged: false,
863
+ },
864
+ game_camera_attributes: {
865
+ domain: 'game',
866
+ handler: 'handleGameCameraAttributes',
867
+ backend: { kind: 'runtime', command: 'camera_attributes' },
868
+ actions: ['get', 'set'],
869
+ privileged: false,
870
+ },
871
+ game_navigation_3d: {
872
+ domain: 'game',
873
+ handler: 'handleGameNavigation3d',
874
+ backend: { kind: 'runtime', command: 'navigation_3d' },
875
+ actions: ['create', 'bake'],
876
+ privileged: false,
877
+ },
878
+ game_physics_3d: {
879
+ domain: 'game',
880
+ handler: 'handleGamePhysics3d',
881
+ backend: { kind: 'runtime', command: 'physics_3d' },
882
+ actions: ['ray', 'overlap', 'contacts', 'inspect_shape'],
883
+ privileged: false,
884
+ },
885
+ game_canvas: {
886
+ domain: 'game',
887
+ handler: 'handleGameCanvas',
888
+ backend: { kind: 'runtime', command: 'canvas' },
889
+ actions: ['create_layer', 'create_modulate', 'configure'],
890
+ privileged: false,
891
+ },
892
+ game_canvas_draw: {
893
+ domain: 'game',
894
+ handler: 'handleGameCanvasDraw',
895
+ backend: { kind: 'runtime', command: 'canvas_draw' },
896
+ actions: ['line', 'rect', 'circle', 'polygon', 'text', 'clear'],
897
+ privileged: false,
898
+ },
899
+ game_light_2d: {
900
+ domain: 'game',
901
+ handler: 'handleGameLight2d',
902
+ backend: { kind: 'runtime', command: 'light_2d' },
903
+ actions: ['create_point', 'create_directional', 'create_occluder'],
904
+ privileged: false,
905
+ },
906
+ game_parallax: {
907
+ domain: 'game',
908
+ handler: 'handleGameParallax',
909
+ backend: { kind: 'runtime', command: 'parallax' },
910
+ actions: ['create_background', 'add_layer', 'configure'],
911
+ privileged: false,
912
+ },
913
+ game_shape_2d: {
914
+ domain: 'game',
915
+ handler: 'handleGameShape2d',
916
+ backend: { kind: 'runtime', command: 'shape_2d' },
917
+ actions: ['add_point', 'set_points', 'clear', 'get_points'],
918
+ privileged: false,
919
+ },
920
+ game_path_2d: {
921
+ domain: 'game',
922
+ handler: 'handleGamePath2d',
923
+ backend: { kind: 'runtime', command: 'path_2d' },
924
+ actions: ['create', 'add_point', 'get_points'],
925
+ privileged: false,
926
+ },
927
+ game_physics_2d: {
928
+ domain: 'game',
929
+ handler: 'handleGamePhysics2d',
930
+ backend: { kind: 'runtime', command: 'physics_2d' },
931
+ actions: ['ray', 'overlap', 'point_query', 'shape_query'],
932
+ privileged: false,
933
+ },
934
+ game_animation_tree: {
935
+ domain: 'game',
936
+ handler: 'handleGameAnimationTree',
937
+ backend: { kind: 'runtime', command: 'animation_tree' },
938
+ actions: ['travel', 'set_param', 'get_state'],
939
+ privileged: false,
940
+ },
941
+ game_animation_control: {
942
+ domain: 'game',
943
+ handler: 'handleGameAnimationControl',
944
+ backend: { kind: 'runtime', command: 'animation_control' },
945
+ actions: ['seek', 'queue', 'set_speed', 'stop', 'get_info'],
946
+ privileged: false,
947
+ },
948
+ game_skeleton_ik: {
949
+ domain: 'game',
950
+ handler: 'handleGameSkeletonIk',
951
+ backend: { kind: 'runtime', command: 'skeleton_ik' },
952
+ actions: ['start', 'stop', 'set_target'],
953
+ privileged: false,
954
+ },
955
+ game_audio_effect: {
956
+ domain: 'game',
957
+ handler: 'handleGameAudioEffect',
958
+ backend: { kind: 'runtime', command: 'audio_effect' },
959
+ actions: ['list', 'add', 'remove', 'configure'],
960
+ privileged: false,
961
+ },
962
+ game_audio_bus_layout: {
963
+ domain: 'game',
964
+ handler: 'handleGameAudioBusLayout',
965
+ backend: { kind: 'runtime', command: 'audio_bus_layout' },
966
+ actions: ['list', 'add', 'remove', 'move', 'set_send'],
967
+ privileged: false,
968
+ },
969
+ game_audio_spatial: {
970
+ domain: 'game',
971
+ handler: 'handleGameAudioSpatial',
972
+ backend: { kind: 'runtime', command: 'audio_spatial' },
973
+ actions: ['get_info', 'configure'],
974
+ privileged: false,
975
+ },
976
+ rename_file: {
977
+ domain: 'project',
978
+ handler: 'handleRenameFile',
979
+ backend: { kind: 'local' },
980
+ actions: null,
981
+ privileged: false,
982
+ },
983
+ manage_resource: {
984
+ domain: 'project',
985
+ handler: 'handleManageResource',
986
+ backend: { kind: 'authoring-session', command: 'authoring_manage_resource', fallback: { kind: 'subprocess', operation: 'manage_resource' } },
987
+ actions: ['read', 'modify'],
988
+ privileged: false,
989
+ },
990
+ validate_script: {
991
+ domain: 'project',
992
+ handler: 'handleValidateScript',
993
+ backend: { kind: 'godot-cli' },
994
+ actions: null,
995
+ privileged: false,
996
+ },
997
+ validate_scripts: {
998
+ domain: 'project',
999
+ handler: 'handleValidateScripts',
1000
+ backend: { kind: 'godot-cli' },
1001
+ actions: null,
1002
+ privileged: false,
1003
+ },
1004
+ create_script: {
1005
+ domain: 'project',
1006
+ handler: 'handleCreateScript',
1007
+ backend: { kind: 'local' },
1008
+ actions: null,
1009
+ privileged: false,
1010
+ },
1011
+ manage_scene_signals: {
1012
+ domain: 'project',
1013
+ handler: 'handleManageSceneSignals',
1014
+ backend: { kind: 'authoring-session', command: 'authoring_manage_scene_signals', fallback: { kind: 'subprocess', operation: 'manage_scene_signals' } },
1015
+ actions: ['list', 'add', 'remove'],
1016
+ privileged: false,
1017
+ },
1018
+ manage_layers: {
1019
+ domain: 'project',
1020
+ handler: 'handleManageLayers',
1021
+ backend: { kind: 'local' },
1022
+ actions: ['list', 'set'],
1023
+ privileged: false,
1024
+ },
1025
+ manage_plugins: {
1026
+ domain: 'project',
1027
+ handler: 'handleManagePlugins',
1028
+ backend: { kind: 'local' },
1029
+ actions: ['list', 'enable', 'disable'],
1030
+ privileged: false,
1031
+ },
1032
+ manage_shader: {
1033
+ domain: 'project',
1034
+ handler: 'handleManageShader',
1035
+ backend: { kind: 'local' },
1036
+ actions: ['read', 'create'],
1037
+ privileged: false,
1038
+ },
1039
+ manage_theme_resource: {
1040
+ domain: 'project',
1041
+ handler: 'handleManageThemeResource',
1042
+ backend: { kind: 'authoring-session', command: 'authoring_manage_theme_resource', fallback: { kind: 'subprocess', operation: 'manage_theme_resource' } },
1043
+ actions: ['create', 'read', 'modify'],
1044
+ privileged: false,
1045
+ },
1046
+ set_main_scene: {
1047
+ domain: 'project',
1048
+ handler: 'handleSetMainScene',
1049
+ backend: { kind: 'local' },
1050
+ actions: null,
1051
+ privileged: false,
1052
+ },
1053
+ manage_scene_structure: {
1054
+ domain: 'project',
1055
+ handler: 'handleManageSceneStructure',
1056
+ backend: { kind: 'authoring-session', command: 'authoring_manage_scene_structure', fallback: { kind: 'subprocess', operation: 'manage_scene_structure' } },
1057
+ actions: ['rename', 'duplicate', 'move'],
1058
+ privileged: false,
1059
+ },
1060
+ manage_translations: {
1061
+ domain: 'project',
1062
+ handler: 'handleManageTranslations',
1063
+ backend: { kind: 'local' },
1064
+ actions: ['list', 'add', 'remove'],
1065
+ privileged: false,
1066
+ },
1067
+ game_locale: {
1068
+ domain: 'game',
1069
+ handler: 'handleGameLocale',
1070
+ backend: { kind: 'runtime', command: 'locale' },
1071
+ actions: ['get', 'set', 'translate'],
1072
+ privileged: false,
1073
+ },
1074
+ game_ui_control: {
1075
+ domain: 'game',
1076
+ handler: 'handleGameUiControl',
1077
+ backend: { kind: 'runtime', command: 'ui_control' },
1078
+ actions: ['grab_focus', 'release_focus', 'configure', 'get_info'],
1079
+ privileged: false,
1080
+ },
1081
+ game_ui_text: {
1082
+ domain: 'game',
1083
+ handler: 'handleGameUiText',
1084
+ backend: { kind: 'runtime', command: 'ui_text' },
1085
+ actions: ['get', 'set', 'append', 'clear', 'bbcode'],
1086
+ privileged: false,
1087
+ },
1088
+ game_ui_popup: {
1089
+ domain: 'game',
1090
+ handler: 'handleGameUiPopup',
1091
+ backend: { kind: 'runtime', command: 'ui_popup' },
1092
+ actions: ['popup_centered', 'popup', 'hide', 'get_info'],
1093
+ privileged: false,
1094
+ },
1095
+ game_ui_tree: {
1096
+ domain: 'game',
1097
+ handler: 'handleGameUiTree',
1098
+ backend: { kind: 'runtime', command: 'ui_tree' },
1099
+ actions: ['get_items', 'add', 'select', 'collapse', 'expand', 'remove'],
1100
+ privileged: false,
1101
+ },
1102
+ game_ui_item_list: {
1103
+ domain: 'game',
1104
+ handler: 'handleGameUiItemList',
1105
+ backend: { kind: 'runtime', command: 'ui_item_list' },
1106
+ actions: ['get_items', 'select', 'add', 'remove', 'clear'],
1107
+ privileged: false,
1108
+ },
1109
+ game_ui_tabs: {
1110
+ domain: 'game',
1111
+ handler: 'handleGameUiTabs',
1112
+ backend: { kind: 'runtime', command: 'ui_tabs' },
1113
+ actions: ['get_tabs', 'set_current', 'set_title'],
1114
+ privileged: false,
1115
+ },
1116
+ game_ui_menu: {
1117
+ domain: 'game',
1118
+ handler: 'handleGameUiMenu',
1119
+ backend: { kind: 'runtime', command: 'ui_menu' },
1120
+ actions: ['get_items', 'add', 'remove', 'set_checked', 'clear'],
1121
+ privileged: false,
1122
+ },
1123
+ game_ui_range: {
1124
+ domain: 'game',
1125
+ handler: 'handleGameUiRange',
1126
+ backend: { kind: 'runtime', command: 'ui_range' },
1127
+ actions: ['get', 'set'],
1128
+ privileged: false,
1129
+ },
1130
+ game_render_settings: {
1131
+ domain: 'game',
1132
+ handler: 'handleGameRenderSettings',
1133
+ backend: { kind: 'runtime', command: 'render_settings' },
1134
+ actions: ['get', 'set'],
1135
+ privileged: false,
1136
+ },
1137
+ game_resource: {
1138
+ domain: 'game',
1139
+ handler: 'handleGameResource',
1140
+ backend: { kind: 'runtime', command: 'resource' },
1141
+ actions: ['load', 'preload', 'save', 'exists'],
1142
+ privileged: false,
1143
+ },
1144
+ game_visual_shader: {
1145
+ domain: 'game',
1146
+ handler: 'handleGameVisualShader',
1147
+ backend: { kind: 'runtime', command: 'visual_shader' },
1148
+ actions: ['create', 'add_node', 'connect', 'disconnect', 'get_nodes', 'apply'],
1149
+ privileged: false,
1150
+ },
1151
+ game_terrain: {
1152
+ domain: 'game',
1153
+ handler: 'handleGameTerrain',
1154
+ backend: { kind: 'runtime', command: 'terrain' },
1155
+ actions: ['create', 'get_height', 'modify', 'paint'],
1156
+ privileged: false,
1157
+ },
1158
+ game_video: {
1159
+ domain: 'game',
1160
+ handler: 'handleGameVideo',
1161
+ backend: { kind: 'runtime', command: 'video' },
1162
+ actions: ['create', 'play', 'pause', 'resume', 'stop', 'seek', 'get_status'],
1163
+ privileged: false,
1164
+ },
1165
+ manage_ci_pipeline: {
1166
+ domain: 'project',
1167
+ handler: 'handleManageCiPipeline',
1168
+ backend: { kind: 'local' },
1169
+ actions: ['create', 'read'],
1170
+ privileged: false,
1171
+ },
1172
+ manage_docker_export: {
1173
+ domain: 'project',
1174
+ handler: 'handleManageDockerExport',
1175
+ backend: { kind: 'local' },
1176
+ actions: ['create', 'read'],
1177
+ privileged: false,
1178
+ },
1179
+ };
1180
+ const authoringBackendsByOperation = new Map();
1181
+ for (const entry of Object.values(toolManifest)) {
1182
+ if (entry.backend.kind !== 'authoring-session')
1183
+ continue;
1184
+ const operation = entry.backend.fallback.operation;
1185
+ if (authoringBackendsByOperation.has(operation)) {
1186
+ throw new Error(`Duplicate authoring operation backend: ${operation}`);
1187
+ }
1188
+ authoringBackendsByOperation.set(operation, entry.backend);
1189
+ }
1190
+ /** Resolves an operation through the public tool's declared backend policy. */
1191
+ export function authoringBackendForOperation(operation) {
1192
+ return authoringBackendsByOperation.get(operation);
1193
+ }