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,71 +1,301 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Condensed Inspect Test Suite (15 cases) — safe for real Editor runs.
4
- * Tools used: control_actor (bootstrap), inspect
3
+ * Comprehensive Inspect Test Suite
4
+ * Tool: inspect
5
+ * Coverage: All 17 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 = [
10
- // 1. Bootstrap: spawn a mesh actor for inspection (using control_actor instead of execute_python)
11
- { scenario: 'Bootstrap - spawn InspectActor', toolName: 'control_actor', arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'Inspect_A', location: { x: 0, y: 0, z: 200 } }, expected: 'success - bootstrap created' },
12
- // 2. Inspect actor by name
13
- { scenario: 'Inspect actor by name', toolName: 'inspect', arguments: { action: 'inspect_object', name: 'Inspect_A' }, expected: 'success - object inspected' },
14
- // 3. Get a property from the actor
15
- { scenario: 'Get actor location property', toolName: 'inspect', arguments: { action: 'get_property', name: 'Inspect_A', propertyPath: 'ActorLocation' }, expected: 'success - property retrieved' },
16
- // 4. Set a property on the actor
17
- { scenario: 'Set actor hidden property', toolName: 'inspect', arguments: { action: 'set_property', name: 'Inspect_A', propertyPath: 'bHidden', value: true }, expected: 'success - property set' },
18
- // 5. Inspect component list
19
- { scenario: 'Get components on actor', toolName: 'inspect', arguments: { action: 'get_components', name: 'Inspect_A' }, expected: 'success - components returned' },
20
- // 6. Get component property
21
- { scenario: 'Get static mesh component mesh', toolName: 'inspect', arguments: { action: 'get_component_property', name: 'Inspect_A', componentName: 'StaticMeshComponent', propertyPath: 'StaticMesh' }, expected: 'success - component property retrieved' },
22
- // 7. Set component mobility
23
- { scenario: 'Set component mobility', toolName: 'inspect', arguments: { action: 'set_component_property', name: 'Inspect_A', componentName: 'StaticMeshComponent', propertyPath: 'Mobility', value: 'Movable' }, expected: 'success - component property set' },
24
- // 8. Query actor metadata (best-effort)
25
- { scenario: 'Get actor metadata', toolName: 'inspect', arguments: { action: 'get_metadata', name: 'Inspect_A' }, expected: 'success - metadata returned' },
26
- // 9. Add a tag to the actor
27
- { scenario: 'Add tag to actor', toolName: 'inspect', arguments: { action: 'add_tag', name: 'Inspect_A', tag: 'InspectTC' }, expected: 'success - tag added' },
28
- // 10. Find actors by tag
29
- { scenario: 'Find actors by tag', toolName: 'inspect', arguments: { action: 'find_by_tag', tag: 'InspectTC' }, expected: 'success - actors found' },
30
- // 11. Save actor state (best-effort)
31
- { scenario: 'Save actor snapshot', toolName: 'inspect', arguments: { action: 'create_snapshot', name: 'Inspect_A', snapshotName: 'Inspect_A_Snap' }, expected: 'success - snapshot created' },
32
- // 12. Restore actor state
33
- { scenario: 'Restore actor snapshot', toolName: 'inspect', arguments: { action: 'restore_snapshot', name: 'Inspect_A', snapshotName: 'Inspect_A_Snap' }, expected: 'success - snapshot restored' },
34
- // 13. Export actor to JSON
35
- { scenario: 'Export actor', toolName: 'inspect', arguments: { action: 'export', name: 'Inspect_A', format: 'JSON', outputPath: './tests/reports/inspect_actor_export.json' }, expected: 'success - actor exported' },
36
- // 14. Delete test actor via inspect
37
- { scenario: 'Delete actor', toolName: 'inspect', arguments: { action: 'delete_object', name: 'Inspect_A' }, expected: 'success - actor deleted' },
38
- // 15. Verify deletion with a simple list
39
- { scenario: 'Verify actor deleted', toolName: 'inspect', arguments: { action: 'list_objects', filter: 'Inspect_A' }, expected: 'success - deleted or not found' },
40
- // Additional
41
- { scenario: 'List objects', toolName: 'inspect', arguments: { action: 'list_objects', filter: 'Inspect_' }, expected: 'success or handled' },
42
- { scenario: 'Find by class', toolName: 'inspect', arguments: { action: 'find_by_class', className: 'StaticMeshActor' }, expected: 'success or handled' },
43
- { scenario: 'Get bounding box', toolName: 'inspect', arguments: { action: 'get_bounding_box', name: 'Inspect_A' }, expected: 'error|ACTOR_NOT_FOUND' },
44
- { scenario: 'Inspect blueprint class (best-effort)', toolName: 'inspect', arguments: { action: 'inspect_class', classPath: '/Game/Blueprints/BP_Auto' }, expected: 'success or handled' },
45
- { scenario: 'Verify delete again', toolName: 'inspect', arguments: { action: 'delete_object', name: 'Inspect_A' }, expected: 'error|NOT_FOUND' },
46
- {
47
- scenario: "Error: Invalid object path",
48
- toolName: "inspect",
49
- arguments: { action: "inspect_object", objectPath: "/Invalid/Path" },
50
- expected: "not_found"
51
- },
52
- {
53
- scenario: "Edge: Set invalid property",
54
- toolName: "inspect",
55
- arguments: { action: "set_property", objectPath: "/Valid", propertyName: "InvalidProp", value: 1 },
56
- expected: "error|unknown_property|OBJECT_NOT_FOUND"
57
- },
58
- {
59
- scenario: "Border: Empty tag add",
60
- toolName: "inspect",
61
- arguments: { action: "add_tag", objectPath: "/Valid", tag: "" },
62
- expected: "success|handled"
63
- },
64
- {
65
- scenario: "Error: Find invalid class",
66
- toolName: "inspect",
67
- arguments: { action: "find_by_class", className: "InvalidClass" },
68
- expected: "no_results|success"
11
+ // === BOOTSTRAP ===
12
+ {
13
+ scenario: 'Bootstrap - spawn InspectActor',
14
+ toolName: 'control_actor',
15
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'Inspect_A', location: { x: 0, y: 0, z: 200 } },
16
+ expected: 'success - bootstrap created'
17
+ },
18
+ {
19
+ scenario: 'Bootstrap - spawn second actor',
20
+ toolName: 'control_actor',
21
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Sphere', actorName: 'Inspect_B', location: { x: 100, y: 0, z: 200 } },
22
+ expected: 'success'
23
+ },
24
+
25
+ // === INSPECT OBJECT ===
26
+ {
27
+ scenario: 'Inspect actor by name',
28
+ toolName: 'inspect',
29
+ arguments: { action: 'inspect_object', name: 'Inspect_A' },
30
+ expected: 'success - object inspected'
31
+ },
32
+ {
33
+ scenario: 'Inspect actor by path',
34
+ toolName: 'inspect',
35
+ arguments: { action: 'inspect_object', objectPath: '/Engine/BasicShapes/Cube' },
36
+ expected: 'success'
37
+ },
38
+
39
+ // === INSPECT CLASS ===
40
+ {
41
+ scenario: 'Inspect class (StaticMeshActor)',
42
+ toolName: 'inspect',
43
+ arguments: { action: 'inspect_class', className: 'StaticMeshActor' },
44
+ expected: 'success'
45
+ },
46
+ {
47
+ scenario: 'Inspect class (Actor)',
48
+ toolName: 'inspect',
49
+ arguments: { action: 'inspect_class', className: 'Actor' },
50
+ expected: 'success'
51
+ },
52
+ {
53
+ scenario: 'Inspect class by path',
54
+ toolName: 'inspect',
55
+ arguments: { action: 'inspect_class', classPath: '/Script/Engine.Actor' },
56
+ expected: 'success'
57
+ },
58
+
59
+ // === LIST OBJECTS ===
60
+ {
61
+ scenario: 'List objects (all)',
62
+ toolName: 'inspect',
63
+ arguments: { action: 'list_objects' },
64
+ expected: 'success'
65
+ },
66
+ {
67
+ scenario: 'List objects (filtered)',
68
+ toolName: 'inspect',
69
+ arguments: { action: 'list_objects', filter: 'Inspect_' },
70
+ expected: 'success'
71
+ },
72
+
73
+ // === FIND BY CLASS ===
74
+ {
75
+ scenario: 'Find by class (StaticMeshActor)',
76
+ toolName: 'inspect',
77
+ arguments: { action: 'find_by_class', className: 'StaticMeshActor' },
78
+ expected: 'success'
79
+ },
80
+ {
81
+ scenario: 'Find by class (PointLight)',
82
+ toolName: 'inspect',
83
+ arguments: { action: 'find_by_class', className: 'PointLight' },
84
+ expected: 'success'
85
+ },
86
+
87
+ // === GET/SET PROPERTY ===
88
+ {
89
+ scenario: 'Get actor location property',
90
+ toolName: 'inspect',
91
+ arguments: { action: 'get_property', name: 'Inspect_A', propertyName: 'ActorLocation' },
92
+ expected: 'success - property retrieved'
93
+ },
94
+ {
95
+ scenario: 'Get actor hidden property',
96
+ toolName: 'inspect',
97
+ arguments: { action: 'get_property', name: 'Inspect_A', propertyName: 'bHidden' },
98
+ expected: 'success'
99
+ },
100
+ {
101
+ scenario: 'Set actor hidden property (true)',
102
+ toolName: 'inspect',
103
+ arguments: { action: 'set_property', name: 'Inspect_A', propertyName: 'bHidden', value: true },
104
+ expected: 'success - property set'
105
+ },
106
+ {
107
+ scenario: 'Set actor hidden property (false)',
108
+ toolName: 'inspect',
109
+ arguments: { action: 'set_property', name: 'Inspect_A', propertyName: 'bHidden', value: false },
110
+ expected: 'success'
111
+ },
112
+
113
+ // === GET COMPONENTS ===
114
+ {
115
+ scenario: 'Get components on actor',
116
+ toolName: 'inspect',
117
+ arguments: { action: 'get_components', name: 'Inspect_A' },
118
+ expected: 'success - components returned'
119
+ },
120
+ {
121
+ scenario: 'Get components on second actor',
122
+ toolName: 'inspect',
123
+ arguments: { action: 'get_components', name: 'Inspect_B' },
124
+ expected: 'success'
125
+ },
126
+
127
+ // === GET/SET COMPONENT PROPERTY ===
128
+ {
129
+ scenario: 'Get component property (StaticMesh)',
130
+ toolName: 'inspect',
131
+ arguments: { action: 'get_component_property', name: 'Inspect_A', componentName: 'StaticMeshComponent', propertyName: 'StaticMesh' },
132
+ expected: 'success - component property retrieved'
133
+ },
134
+ {
135
+ scenario: 'Set component property (Mobility)',
136
+ toolName: 'inspect',
137
+ arguments: { action: 'set_component_property', name: 'Inspect_A', componentName: 'StaticMeshComponent', propertyName: 'Mobility', value: 'Movable' },
138
+ expected: 'success - component property set'
139
+ },
140
+ {
141
+ scenario: 'Get component property (Visibility)',
142
+ toolName: 'inspect',
143
+ arguments: { action: 'get_component_property', name: 'Inspect_A', componentName: 'StaticMeshComponent', propertyName: 'bVisible' },
144
+ expected: 'success'
145
+ },
146
+
147
+ // === GET BOUNDING BOX ===
148
+ {
149
+ scenario: 'Get bounding box',
150
+ toolName: 'inspect',
151
+ arguments: { action: 'get_bounding_box', name: 'Inspect_A' },
152
+ expected: 'success'
153
+ },
154
+ {
155
+ scenario: 'Get bounding box (second actor)',
156
+ toolName: 'inspect',
157
+ arguments: { action: 'get_bounding_box', name: 'Inspect_B' },
158
+ expected: 'success'
159
+ },
160
+
161
+ // === METADATA ===
162
+ {
163
+ scenario: 'Get actor metadata',
164
+ toolName: 'inspect',
165
+ arguments: { action: 'get_metadata', name: 'Inspect_A' },
166
+ expected: 'success - metadata returned'
167
+ },
168
+
169
+ // === TAGS ===
170
+ {
171
+ scenario: 'Add tag to actor',
172
+ toolName: 'inspect',
173
+ arguments: { action: 'add_tag', name: 'Inspect_A', tag: 'InspectTC' },
174
+ expected: 'success - tag added'
175
+ },
176
+ {
177
+ scenario: 'Add second tag',
178
+ toolName: 'inspect',
179
+ arguments: { action: 'add_tag', name: 'Inspect_A', tag: 'TestTag' },
180
+ expected: 'success'
181
+ },
182
+ {
183
+ scenario: 'Find actors by tag',
184
+ toolName: 'inspect',
185
+ arguments: { action: 'find_by_tag', tag: 'InspectTC' },
186
+ expected: 'success - actors found'
187
+ },
188
+
189
+ // === SNAPSHOTS ===
190
+ {
191
+ scenario: 'Create actor snapshot',
192
+ toolName: 'inspect',
193
+ arguments: { action: 'create_snapshot', name: 'Inspect_A', snapshotName: 'Inspect_A_Snap' },
194
+ expected: 'success - snapshot created'
195
+ },
196
+ {
197
+ scenario: 'Restore actor snapshot',
198
+ toolName: 'inspect',
199
+ arguments: { action: 'restore_snapshot', name: 'Inspect_A', snapshotName: 'Inspect_A_Snap' },
200
+ expected: 'success - snapshot restored'
201
+ },
202
+
203
+ // === EXPORT ===
204
+ {
205
+ scenario: 'Export actor to JSON',
206
+ toolName: 'inspect',
207
+ arguments: { action: 'export', name: 'Inspect_A', format: 'JSON', outputPath: './tests/reports/inspect_actor_export.json' },
208
+ expected: 'success - actor exported'
209
+ },
210
+ {
211
+ scenario: 'Export second actor',
212
+ toolName: 'inspect',
213
+ arguments: { action: 'export', name: 'Inspect_B', format: 'JSON', outputPath: './tests/reports/inspect_actor_b_export.json' },
214
+ expected: 'success'
215
+ },
216
+
217
+ // === DELETE OBJECT ===
218
+ {
219
+ scenario: 'Delete second actor',
220
+ toolName: 'inspect',
221
+ arguments: { action: 'delete_object', name: 'Inspect_B' },
222
+ expected: 'success'
223
+ },
224
+ {
225
+ scenario: 'Verify second actor deleted',
226
+ toolName: 'inspect',
227
+ arguments: { action: 'list_objects', filter: 'Inspect_B' },
228
+ expected: 'success'
229
+ },
230
+ {
231
+ scenario: 'Delete first actor',
232
+ toolName: 'inspect',
233
+ arguments: { action: 'delete_object', name: 'Inspect_A' },
234
+ expected: 'success - actor deleted'
235
+ },
236
+ {
237
+ scenario: 'Verify first actor deleted',
238
+ toolName: 'inspect',
239
+ arguments: { action: 'list_objects', filter: 'Inspect_A' },
240
+ expected: 'success - deleted or not found'
241
+ },
242
+
243
+ // === ERROR CASES ===
244
+ {
245
+ scenario: 'Error: Invalid object path',
246
+ toolName: 'inspect',
247
+ arguments: { action: 'inspect_object', objectPath: '/Invalid/Path' },
248
+ expected: 'not_found'
249
+ },
250
+ {
251
+ scenario: 'Error: Set invalid property',
252
+ toolName: 'inspect',
253
+ arguments: { action: 'set_property', name: 'NonExistentActor', propertyName: 'InvalidProp', value: 1 },
254
+ expected: 'error|unknown_property|OBJECT_NOT_FOUND'
255
+ },
256
+ {
257
+ scenario: 'Error: Find invalid class',
258
+ toolName: 'inspect',
259
+ arguments: { action: 'find_by_class', className: 'InvalidClass' },
260
+ expected: 'no_results|success'
261
+ },
262
+ {
263
+ scenario: 'Error: Get property non-existent actor',
264
+ toolName: 'inspect',
265
+ arguments: { action: 'get_property', name: 'NonExistentActor', propertyName: 'ActorLocation' },
266
+ expected: 'error|not_found'
267
+ },
268
+ {
269
+ scenario: 'Error: Get component non-existent',
270
+ toolName: 'inspect',
271
+ arguments: { action: 'get_component_property', name: 'Inspect_A', componentName: 'NonExistentComponent', propertyName: 'Value' },
272
+ expected: 'error|not_found'
273
+ },
274
+ {
275
+ scenario: 'Error: Get bounding box deleted actor',
276
+ toolName: 'inspect',
277
+ arguments: { action: 'get_bounding_box', name: 'Inspect_A' },
278
+ expected: 'error|ACTOR_NOT_FOUND'
279
+ },
280
+ {
281
+ scenario: 'Error: Create snapshot deleted actor',
282
+ toolName: 'inspect',
283
+ arguments: { action: 'create_snapshot', name: 'Inspect_A', snapshotName: 'FailSnap' },
284
+ expected: 'error|not_found'
285
+ },
286
+
287
+ // === EDGE CASES ===
288
+ {
289
+ scenario: 'Edge: Empty tag add',
290
+ toolName: 'inspect',
291
+ arguments: { action: 'add_tag', name: 'Inspect_A', tag: '' },
292
+ expected: 'success|handled|error'
293
+ },
294
+ {
295
+ scenario: 'Edge: Delete already deleted object',
296
+ toolName: 'inspect',
297
+ arguments: { action: 'delete_object', name: 'Inspect_A' },
298
+ expected: 'error|NOT_FOUND'
69
299
  }
70
300
  ];
71
301