unreal-engine-mcp-server 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/.env.example +1 -1
  2. package/.github/release-drafter-config.yml +51 -0
  3. package/.github/workflows/greetings.yml +5 -1
  4. package/.github/workflows/labeler.yml +2 -1
  5. package/.github/workflows/publish-mcp.yml +1 -0
  6. package/.github/workflows/release-drafter.yml +1 -1
  7. package/.github/workflows/release.yml +3 -3
  8. package/CHANGELOG.md +71 -0
  9. package/CONTRIBUTING.md +1 -1
  10. package/GEMINI.md +115 -0
  11. package/Public/Plugin_setup_guide.mp4 +0 -0
  12. package/README.md +166 -200
  13. package/dist/config.d.ts +0 -1
  14. package/dist/config.js +0 -1
  15. package/dist/constants.d.ts +4 -0
  16. package/dist/constants.js +4 -0
  17. package/dist/graphql/loaders.d.ts +64 -0
  18. package/dist/graphql/loaders.js +117 -0
  19. package/dist/graphql/resolvers.d.ts +3 -3
  20. package/dist/graphql/resolvers.js +33 -30
  21. package/dist/graphql/server.js +3 -1
  22. package/dist/graphql/types.d.ts +2 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +13 -2
  25. package/dist/server-setup.d.ts +0 -1
  26. package/dist/server-setup.js +0 -40
  27. package/dist/tools/actors.d.ts +40 -24
  28. package/dist/tools/actors.js +8 -2
  29. package/dist/tools/assets.d.ts +19 -71
  30. package/dist/tools/assets.js +28 -22
  31. package/dist/tools/base-tool.d.ts +4 -4
  32. package/dist/tools/base-tool.js +1 -1
  33. package/dist/tools/blueprint.d.ts +33 -61
  34. package/dist/tools/consolidated-tool-handlers.js +96 -110
  35. package/dist/tools/dynamic-handler-registry.d.ts +11 -9
  36. package/dist/tools/dynamic-handler-registry.js +17 -95
  37. package/dist/tools/editor.d.ts +19 -193
  38. package/dist/tools/editor.js +8 -0
  39. package/dist/tools/environment.d.ts +8 -14
  40. package/dist/tools/foliage.d.ts +18 -143
  41. package/dist/tools/foliage.js +4 -2
  42. package/dist/tools/handlers/actor-handlers.js +0 -5
  43. package/dist/tools/handlers/asset-handlers.js +454 -454
  44. package/dist/tools/landscape.d.ts +16 -116
  45. package/dist/tools/landscape.js +7 -3
  46. package/dist/tools/level.d.ts +22 -103
  47. package/dist/tools/level.js +24 -16
  48. package/dist/tools/lighting.js +5 -1
  49. package/dist/tools/materials.js +5 -1
  50. package/dist/tools/niagara.js +37 -2
  51. package/dist/tools/performance.d.ts +0 -1
  52. package/dist/tools/performance.js +0 -1
  53. package/dist/tools/physics.js +5 -1
  54. package/dist/tools/sequence.d.ts +24 -24
  55. package/dist/tools/sequence.js +13 -0
  56. package/dist/tools/ui.d.ts +0 -2
  57. package/dist/types/automation-responses.d.ts +115 -0
  58. package/dist/types/automation-responses.js +2 -0
  59. package/dist/types/responses.d.ts +249 -0
  60. package/dist/types/responses.js +2 -0
  61. package/dist/types/tool-interfaces.d.ts +135 -135
  62. package/dist/utils/command-validator.js +3 -2
  63. package/dist/utils/path-security.d.ts +2 -0
  64. package/dist/utils/path-security.js +24 -0
  65. package/dist/utils/response-factory.d.ts +4 -4
  66. package/dist/utils/response-factory.js +15 -21
  67. package/docs/Migration-Guide-v0.5.0.md +1 -9
  68. package/docs/testing-guide.md +2 -2
  69. package/package.json +12 -6
  70. package/scripts/run-all-tests.mjs +25 -20
  71. package/server.json +3 -2
  72. package/src/config.ts +1 -1
  73. package/src/constants.ts +7 -0
  74. package/src/graphql/loaders.ts +244 -0
  75. package/src/graphql/resolvers.ts +47 -49
  76. package/src/graphql/server.ts +3 -1
  77. package/src/graphql/types.ts +3 -0
  78. package/src/index.ts +15 -2
  79. package/src/resources/assets.ts +5 -4
  80. package/src/server-setup.ts +3 -37
  81. package/src/tools/actors.ts +36 -28
  82. package/src/tools/animation.ts +1 -0
  83. package/src/tools/assets.ts +74 -63
  84. package/src/tools/base-tool.ts +3 -3
  85. package/src/tools/blueprint.ts +59 -59
  86. package/src/tools/consolidated-tool-handlers.ts +129 -150
  87. package/src/tools/dynamic-handler-registry.ts +22 -140
  88. package/src/tools/editor.ts +39 -26
  89. package/src/tools/environment.ts +21 -27
  90. package/src/tools/foliage.ts +28 -25
  91. package/src/tools/handlers/actor-handlers.ts +2 -8
  92. package/src/tools/handlers/asset-handlers.ts +484 -484
  93. package/src/tools/handlers/sequence-handlers.ts +1 -1
  94. package/src/tools/landscape.ts +34 -28
  95. package/src/tools/level.ts +96 -76
  96. package/src/tools/lighting.ts +6 -1
  97. package/src/tools/materials.ts +8 -2
  98. package/src/tools/niagara.ts +44 -2
  99. package/src/tools/performance.ts +1 -2
  100. package/src/tools/physics.ts +7 -1
  101. package/src/tools/sequence.ts +41 -25
  102. package/src/tools/ui.ts +0 -2
  103. package/src/types/automation-responses.ts +119 -0
  104. package/src/types/responses.ts +355 -0
  105. package/src/types/tool-interfaces.ts +135 -135
  106. package/src/utils/command-validator.ts +3 -2
  107. package/src/utils/normalize.test.ts +162 -0
  108. package/src/utils/path-security.ts +43 -0
  109. package/src/utils/response-factory.ts +29 -24
  110. package/src/utils/safe-json.test.ts +90 -0
  111. package/src/utils/validation.test.ts +184 -0
  112. package/tests/test-animation.mjs +358 -33
  113. package/tests/test-asset-graph.mjs +311 -0
  114. package/tests/test-audio.mjs +314 -116
  115. package/tests/test-behavior-tree.mjs +327 -144
  116. package/tests/test-blueprint-graph.mjs +343 -12
  117. package/tests/test-control-editor.mjs +85 -53
  118. package/tests/test-graphql.mjs +58 -8
  119. package/tests/test-input.mjs +349 -0
  120. package/tests/test-inspect.mjs +291 -61
  121. package/tests/test-landscape.mjs +304 -48
  122. package/tests/test-lighting.mjs +428 -0
  123. package/tests/test-manage-level.mjs +70 -51
  124. package/tests/test-performance.mjs +539 -0
  125. package/tests/test-sequence.mjs +82 -46
  126. package/tests/test-system.mjs +72 -33
  127. package/tests/test-wasm.mjs +98 -8
  128. package/vitest.config.ts +35 -0
  129. package/.github/release-drafter.yml +0 -148
  130. package/dist/prompts/index.d.ts +0 -21
  131. package/dist/prompts/index.js +0 -217
  132. package/dist/tools/blueprint/helpers.d.ts +0 -29
  133. package/dist/tools/blueprint/helpers.js +0 -182
  134. package/src/prompts/index.ts +0 -249
  135. package/src/tools/blueprint/helpers.ts +0 -189
  136. package/tests/test-blueprint-events.mjs +0 -35
  137. package/tests/test-extra-tools.mjs +0 -38
  138. package/tests/test-render.mjs +0 -33
  139. package/tests/test-search-assets.mjs +0 -66
@@ -1,218 +1,416 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Audio Management Test Suite (20 cases)
3
+ * Comprehensive Audio Management Test Suite
4
4
  * Tool: manage_audio
5
+ * Coverage: All 22 actions with success, error, and edge cases
5
6
  */
6
7
 
7
8
  import { runToolTests } from './test-runner.mjs';
8
9
 
9
10
  const testCases = [
11
+ // === SOUND CUE CREATION ===
10
12
  {
11
- scenario: "Create Sound Cue",
12
- toolName: "manage_audio",
13
+ scenario: 'Create Sound Cue',
14
+ toolName: 'manage_audio',
13
15
  arguments: {
14
- action: "create_sound_cue",
15
- name: "SC_TestCue",
16
- soundPath: "/Engine/EngineSounds/WhiteNoise",
17
- location: { x: 0, y: 0, z: 0 }, // Optional but checking if accepted
16
+ action: 'create_sound_cue',
17
+ name: 'SC_TestCue',
18
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
18
19
  volume: 0.8,
19
20
  pitch: 1.2
20
21
  },
21
- expected: "success"
22
+ expected: 'success'
22
23
  },
23
24
  {
24
- scenario: "Play Sound at Location",
25
- toolName: "manage_audio",
25
+ scenario: 'Create Sound Cue with location',
26
+ toolName: 'manage_audio',
26
27
  arguments: {
27
- action: "play_sound_at_location",
28
- soundPath: "/Engine/EngineSounds/WhiteNoise",
28
+ action: 'create_sound_cue',
29
+ name: 'SC_TestCue3D',
30
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
31
+ location: { x: 100, y: 0, z: 0 },
32
+ volume: 1.0
33
+ },
34
+ expected: 'success'
35
+ },
36
+
37
+ // === PLAY SOUND (play_sound_at_location, play_sound_2d, play_sound_attached, spawn_sound_at_location) ===
38
+ {
39
+ scenario: 'Play Sound at Location',
40
+ toolName: 'manage_audio',
41
+ arguments: {
42
+ action: 'play_sound_at_location',
43
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
29
44
  location: { x: 100, y: 0, z: 50 },
30
45
  volume: 1.0,
31
46
  pitch: 1.0
32
47
  },
33
- expected: "success"
48
+ expected: 'success'
34
49
  },
35
50
  {
36
- scenario: "Play Sound 2D",
37
- toolName: "manage_audio",
51
+ scenario: 'Play Sound 2D',
52
+ toolName: 'manage_audio',
38
53
  arguments: {
39
- action: "play_sound_2d",
40
- soundPath: "/Engine/EngineSounds/WhiteNoise",
54
+ action: 'play_sound_2d',
55
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
41
56
  volume: 0.5,
42
57
  pitch: 1.0
43
58
  },
44
- expected: "success"
59
+ expected: 'success'
60
+ },
61
+ {
62
+ scenario: 'Play Sound with Rotation',
63
+ toolName: 'manage_audio',
64
+ arguments: {
65
+ action: 'play_sound_at_location',
66
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
67
+ location: { x: 0, y: 0, z: 0 },
68
+ rotation: { pitch: 45, yaw: 90, roll: 0 },
69
+ volume: 1.0
70
+ },
71
+ expected: 'success'
72
+ },
73
+ {
74
+ scenario: 'Play Sound Attached',
75
+ toolName: 'manage_audio',
76
+ arguments: {
77
+ action: 'play_sound_attached',
78
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
79
+ actorName: 'TestActor',
80
+ attachPointName: 'RootComponent',
81
+ volume: 0.8
82
+ },
83
+ expected: 'success|not_found'
84
+ },
85
+ {
86
+ scenario: 'Spawn Sound at Location',
87
+ toolName: 'manage_audio',
88
+ arguments: {
89
+ action: 'spawn_sound_at_location',
90
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
91
+ location: { x: 200, y: 200, z: 0 },
92
+ volume: 0.7
93
+ },
94
+ expected: 'success'
45
95
  },
96
+
97
+ // === AUDIO COMPONENT (create_audio_component) ===
46
98
  {
47
- scenario: "Create Audio Component",
48
- toolName: "manage_audio",
99
+ scenario: 'Create Audio Component',
100
+ toolName: 'manage_audio',
49
101
  arguments: {
50
- action: "create_audio_component",
51
- soundPath: "/Engine/EngineSounds/WhiteNoise",
102
+ action: 'create_audio_component',
103
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
52
104
  location: { x: 200, y: 0, z: 0 },
53
105
  volume: 0.7
54
106
  },
55
- expected: "success"
107
+ expected: 'success'
56
108
  },
57
109
  {
58
- scenario: "Create Sound Mix",
59
- toolName: "manage_audio",
110
+ scenario: 'Create Audio Component with Attenuation',
111
+ toolName: 'manage_audio',
60
112
  arguments: {
61
- action: "create_sound_mix",
62
- name: "SM_TestMix"
113
+ action: 'create_audio_component',
114
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
115
+ location: { x: 0, y: 0, z: 0 },
116
+ volume: 1.0,
117
+ falloffDistance: 1000
118
+ },
119
+ expected: 'success'
120
+ },
121
+
122
+ // === SOUND MIXES (create_sound_mix, push_sound_mix, pop_sound_mix) ===
123
+ {
124
+ scenario: 'Create Sound Mix',
125
+ toolName: 'manage_audio',
126
+ arguments: {
127
+ action: 'create_sound_mix',
128
+ name: 'SM_TestMix'
63
129
  },
64
- expected: "success"
130
+ expected: 'success'
65
131
  },
66
132
  {
67
- scenario: "Push Sound Mix",
68
- toolName: "manage_audio",
133
+ scenario: 'Push Sound Mix',
134
+ toolName: 'manage_audio',
69
135
  arguments: {
70
- action: "push_sound_mix",
71
- name: "SM_TestMix" // Assuming name param maps to mixName or it handles name
136
+ action: 'push_sound_mix',
137
+ mixName: 'SM_TestMix'
72
138
  },
73
- expected: "success"
139
+ expected: 'success'
74
140
  },
75
141
  {
76
- scenario: "Pop Sound Mix", // Note: Pop might not be explicitly in definitions but let's check if supported or if push toggles
77
- toolName: "manage_audio",
142
+ scenario: 'Pop Sound Mix',
143
+ toolName: 'manage_audio',
78
144
  arguments: {
79
- action: "push_sound_mix", // Re-pushing might not be pop, checking if pop exists. Definition says 'push_sound_mix'.
80
- // Actually, 'manage_audio' def has: create_sound_cue, play_sound_at_location, play_sound_2d, create_audio_component, create_sound_mix, push_sound_mix.
81
- // It lacks 'pop_sound_mix' in the enum in definition, but handler might have it?
82
- // Let's stick to supported ones.
83
- name: "SM_TestMix"
145
+ action: 'pop_sound_mix',
146
+ mixName: 'SM_TestMix'
84
147
  },
85
- expected: "success"
148
+ expected: 'success'
86
149
  },
87
- // Expanding with edge cases and variations
88
150
  {
89
- scenario: "Play Sound with Rotation",
90
- toolName: "manage_audio",
151
+ scenario: 'Set Base Sound Mix',
152
+ toolName: 'manage_audio',
91
153
  arguments: {
92
- action: "play_sound_at_location",
93
- soundPath: "/Engine/EngineSounds/WhiteNoise",
154
+ action: 'set_base_sound_mix',
155
+ mixName: 'SM_TestMix'
156
+ },
157
+ expected: 'success'
158
+ },
159
+
160
+ // === SOUND CLASS (create_sound_class, set_sound_mix_class_override, clear_sound_mix_class_override) ===
161
+ {
162
+ scenario: 'Create Sound Class',
163
+ toolName: 'manage_audio',
164
+ arguments: {
165
+ action: 'create_sound_class',
166
+ name: 'SoundClass_TestClass'
167
+ },
168
+ expected: 'success'
169
+ },
170
+ {
171
+ scenario: 'Set Sound Mix Class Override',
172
+ toolName: 'manage_audio',
173
+ arguments: {
174
+ action: 'set_sound_mix_class_override',
175
+ mixName: 'SM_TestMix',
176
+ soundClassName: 'SoundClass_TestClass',
177
+ volume: 0.5,
178
+ pitch: 1.0
179
+ },
180
+ expected: 'success'
181
+ },
182
+ {
183
+ scenario: 'Clear Sound Mix Class Override',
184
+ toolName: 'manage_audio',
185
+ arguments: {
186
+ action: 'clear_sound_mix_class_override',
187
+ mixName: 'SM_TestMix',
188
+ soundClassName: 'SoundClass_TestClass'
189
+ },
190
+ expected: 'success'
191
+ },
192
+
193
+ // === FADING (fade_sound, fade_sound_in, fade_sound_out) ===
194
+ {
195
+ scenario: 'Fade Sound',
196
+ toolName: 'manage_audio',
197
+ arguments: {
198
+ action: 'fade_sound',
199
+ componentName: 'AudioComponent_1',
200
+ targetVolume: 0.2,
201
+ fadeTime: 1.0
202
+ },
203
+ expected: 'success|not_found'
204
+ },
205
+ {
206
+ scenario: 'Fade Sound In',
207
+ toolName: 'manage_audio',
208
+ arguments: {
209
+ action: 'fade_sound_in',
210
+ componentName: 'AudioComponent_1',
211
+ fadeInTime: 2.0,
212
+ targetVolume: 1.0
213
+ },
214
+ expected: 'success|not_found'
215
+ },
216
+ {
217
+ scenario: 'Fade Sound Out',
218
+ toolName: 'manage_audio',
219
+ arguments: {
220
+ action: 'fade_sound_out',
221
+ componentName: 'AudioComponent_1',
222
+ fadeOutTime: 1.5
223
+ },
224
+ expected: 'success|not_found'
225
+ },
226
+
227
+ // === AMBIENT SOUND (create_ambient_sound) ===
228
+ {
229
+ scenario: 'Create Ambient Sound',
230
+ toolName: 'manage_audio',
231
+ arguments: {
232
+ action: 'create_ambient_sound',
233
+ name: 'AmbientSound_Test',
234
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
235
+ location: { x: 0, y: 0, z: 100 }
236
+ },
237
+ expected: 'success'
238
+ },
239
+
240
+ // === REVERB (create_reverb_zone) ===
241
+ {
242
+ scenario: 'Create Reverb Zone',
243
+ toolName: 'manage_audio',
244
+ arguments: {
245
+ action: 'create_reverb_zone',
246
+ name: 'ReverbZone_Test',
94
247
  location: { x: 0, y: 0, z: 0 },
95
- rotation: { pitch: 45, yaw: 90, roll: 0 },
96
- volume: 1.0
248
+ size: { x: 500, y: 500, z: 300 }
97
249
  },
98
- expected: "success"
250
+ expected: 'success'
99
251
  },
252
+
253
+ // === ATTENUATION (set_sound_attenuation) ===
100
254
  {
101
- scenario: "Play Sound Low Volume",
102
- toolName: "manage_audio",
255
+ scenario: 'Set Sound Attenuation',
256
+ toolName: 'manage_audio',
103
257
  arguments: {
104
- action: "play_sound_2d",
105
- soundPath: "/Engine/EngineSounds/WhiteNoise",
106
- volume: 0.01
258
+ action: 'set_sound_attenuation',
259
+ name: 'Attenuation_Test',
260
+ falloffDistance: 2000,
261
+ attenuationShape: 'Sphere'
107
262
  },
108
- expected: "success"
263
+ expected: 'success'
109
264
  },
265
+
266
+ // === AUDIO ANALYSIS (enable_audio_analysis) ===
110
267
  {
111
- scenario: "Play Sound High Pitch",
112
- toolName: "manage_audio",
268
+ scenario: 'Enable Audio Analysis',
269
+ toolName: 'manage_audio',
113
270
  arguments: {
114
- action: "play_sound_2d",
115
- soundPath: "/Engine/EngineSounds/WhiteNoise",
116
- pitch: 2.0
271
+ action: 'enable_audio_analysis',
272
+ enabled: true,
273
+ fftSize: 1024
117
274
  },
118
- expected: "success"
275
+ expected: 'success'
119
276
  },
120
277
  {
121
- scenario: "Create Component Attached (Logic check)",
122
- toolName: "manage_audio",
278
+ scenario: 'Disable Audio Analysis',
279
+ toolName: 'manage_audio',
123
280
  arguments: {
124
- action: "create_audio_component",
125
- soundPath: "/Engine/EngineSounds/WhiteNoise",
126
- attachTo: "RootComponent" // If supported by handler logic
281
+ action: 'enable_audio_analysis',
282
+ enabled: false
127
283
  },
128
- expected: "success|handled"
284
+ expected: 'success'
129
285
  },
286
+
287
+ // === EFFECTS (set_doppler_effect, set_audio_occlusion) ===
130
288
  {
131
- scenario: "Error: Play Non-Existent Sound",
132
- toolName: "manage_audio",
289
+ scenario: 'Set Doppler Effect',
290
+ toolName: 'manage_audio',
133
291
  arguments: {
134
- action: "play_sound_2d",
135
- soundPath: "/Game/NonExistentSound"
292
+ action: 'set_doppler_effect',
293
+ enabled: true,
294
+ scale: 1.5
136
295
  },
137
- expected: "error|not_found"
296
+ expected: 'success'
138
297
  },
139
298
  {
140
- scenario: "Error: Create Cue Invalid Path",
141
- toolName: "manage_audio",
299
+ scenario: 'Set Audio Occlusion',
300
+ toolName: 'manage_audio',
142
301
  arguments: {
143
- action: "create_sound_cue",
144
- name: "SC_Invalid",
145
- soundPath: "/Game/InvalidSound"
302
+ action: 'set_audio_occlusion',
303
+ enabled: true,
304
+ lowPassFilterFrequency: 5000
146
305
  },
147
- expected: "error|not_found"
306
+ expected: 'success'
148
307
  },
308
+
309
+ // === PRIME SOUND ===
149
310
  {
150
- scenario: "Edge: Volume 0",
151
- toolName: "manage_audio",
311
+ scenario: 'Prime Sound',
312
+ toolName: 'manage_audio',
152
313
  arguments: {
153
- action: "play_sound_2d",
154
- soundPath: "/Engine/EngineSounds/WhiteNoise",
155
- volume: 0
314
+ action: 'prime_sound',
315
+ soundPath: '/Engine/EngineSounds/WhiteNoise'
156
316
  },
157
- expected: "success"
317
+ expected: 'success'
158
318
  },
319
+
320
+ // === ERROR CASES ===
159
321
  {
160
- scenario: "Edge: Negative Pitch (Clamped?)",
161
- toolName: "manage_audio",
322
+ scenario: 'Error: Play Non-Existent Sound',
323
+ toolName: 'manage_audio',
162
324
  arguments: {
163
- action: "play_sound_2d",
164
- soundPath: "/Engine/EngineSounds/WhiteNoise",
165
- pitch: -1.0
325
+ action: 'play_sound_2d',
326
+ soundPath: '/Game/NonExistentSound'
166
327
  },
167
- expected: "success|clamped"
328
+ expected: 'error|not_found'
168
329
  },
169
330
  {
170
- scenario: "Create Sound Mix With Adjusters (if supported args)",
171
- toolName: "manage_audio",
331
+ scenario: 'Error: Create Cue Invalid Path',
332
+ toolName: 'manage_audio',
172
333
  arguments: {
173
- action: "create_sound_mix",
174
- name: "SM_ComplexMix"
334
+ action: 'create_sound_cue',
335
+ name: 'SC_Invalid',
336
+ soundPath: '/Game/InvalidSound'
175
337
  },
176
- expected: "success"
338
+ expected: 'error|not_found'
177
339
  },
178
340
  {
179
- scenario: "Batch Play (Stress)",
180
- toolName: "manage_audio",
341
+ scenario: 'Error: Missing Sound Path',
342
+ toolName: 'manage_audio',
181
343
  arguments: {
182
- action: "play_sound_2d",
183
- soundPath: "/Engine/EngineSounds/WhiteNoise"
344
+ action: 'play_sound_2d'
184
345
  },
185
- expected: "success"
346
+ expected: 'error|missing'
186
347
  },
187
348
  {
188
- scenario: "Validation: Missing Sound Path",
189
- toolName: "manage_audio",
349
+ scenario: 'Error: Missing Name for Cue',
350
+ toolName: 'manage_audio',
190
351
  arguments: {
191
- action: "play_sound_2d"
352
+ action: 'create_sound_cue',
353
+ soundPath: '/Engine/EngineSounds/WhiteNoise'
192
354
  },
193
- expected: "error|missing"
355
+ expected: 'error|missing'
194
356
  },
357
+
358
+ // === EDGE CASES ===
195
359
  {
196
- scenario: "Validation: Missing Name",
197
- toolName: "manage_audio",
360
+ scenario: 'Edge: Volume 0 (silent)',
361
+ toolName: 'manage_audio',
198
362
  arguments: {
199
- action: "create_sound_cue",
200
- soundPath: "/Engine/EngineSounds/WhiteNoise"
363
+ action: 'play_sound_2d',
364
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
365
+ volume: 0
201
366
  },
202
- expected: "error|missing"
367
+ expected: 'success'
203
368
  },
204
369
  {
205
- scenario: "Cleanup Audio Assets",
206
- toolName: "manage_asset", // Helper cleanup
370
+ scenario: 'Edge: Negative Pitch',
371
+ toolName: 'manage_audio',
372
+ arguments: {
373
+ action: 'play_sound_2d',
374
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
375
+ pitch: -1.0
376
+ },
377
+ expected: 'success|clamped'
378
+ },
379
+ {
380
+ scenario: 'Edge: Very High Pitch',
381
+ toolName: 'manage_audio',
382
+ arguments: {
383
+ action: 'play_sound_2d',
384
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
385
+ pitch: 10.0
386
+ },
387
+ expected: 'success'
388
+ },
389
+ {
390
+ scenario: 'Edge: Very Low Volume',
391
+ toolName: 'manage_audio',
392
+ arguments: {
393
+ action: 'play_sound_2d',
394
+ soundPath: '/Engine/EngineSounds/WhiteNoise',
395
+ volume: 0.001
396
+ },
397
+ expected: 'success'
398
+ },
399
+
400
+ // === CLEANUP ===
401
+ {
402
+ scenario: 'Cleanup Audio Assets',
403
+ toolName: 'manage_asset',
207
404
  arguments: {
208
- action: "delete",
405
+ action: 'delete',
209
406
  assetPaths: [
210
- "/Game/Audio/SC_TestCue",
211
- "/Game/Audio/SM_TestMix",
212
- "/Game/Audio/SM_ComplexMix"
407
+ '/Game/Audio/SC_TestCue',
408
+ '/Game/Audio/SC_TestCue3D',
409
+ '/Game/Audio/SM_TestMix',
410
+ '/Game/Audio/SoundClass_TestClass'
213
411
  ]
214
412
  },
215
- expected: "success|handled"
413
+ expected: 'success|handled'
216
414
  }
217
415
  ];
218
416