unreal-engine-mcp-server 0.5.0 → 0.5.2

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 (188) 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 +2 -4
  6. package/.github/workflows/release-drafter.yml +3 -2
  7. package/.github/workflows/release.yml +3 -3
  8. package/CHANGELOG.md +109 -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/automation/bridge.d.ts +1 -2
  14. package/dist/automation/bridge.js +24 -23
  15. package/dist/automation/connection-manager.d.ts +1 -0
  16. package/dist/automation/connection-manager.js +10 -0
  17. package/dist/automation/message-handler.js +5 -4
  18. package/dist/automation/request-tracker.d.ts +4 -0
  19. package/dist/automation/request-tracker.js +11 -3
  20. package/dist/config.d.ts +0 -1
  21. package/dist/config.js +0 -1
  22. package/dist/constants.d.ts +4 -0
  23. package/dist/constants.js +4 -0
  24. package/dist/graphql/loaders.d.ts +64 -0
  25. package/dist/graphql/loaders.js +117 -0
  26. package/dist/graphql/resolvers.d.ts +3 -3
  27. package/dist/graphql/resolvers.js +33 -30
  28. package/dist/graphql/server.js +3 -1
  29. package/dist/graphql/types.d.ts +2 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.js +13 -2
  32. package/dist/server-setup.d.ts +0 -1
  33. package/dist/server-setup.js +0 -40
  34. package/dist/tools/actors.d.ts +58 -24
  35. package/dist/tools/actors.js +22 -6
  36. package/dist/tools/assets.d.ts +19 -71
  37. package/dist/tools/assets.js +28 -22
  38. package/dist/tools/base-tool.d.ts +4 -4
  39. package/dist/tools/base-tool.js +1 -1
  40. package/dist/tools/blueprint.d.ts +45 -61
  41. package/dist/tools/blueprint.js +43 -14
  42. package/dist/tools/consolidated-tool-definitions.js +2 -1
  43. package/dist/tools/consolidated-tool-handlers.js +96 -110
  44. package/dist/tools/dynamic-handler-registry.d.ts +11 -9
  45. package/dist/tools/dynamic-handler-registry.js +17 -95
  46. package/dist/tools/editor.d.ts +19 -193
  47. package/dist/tools/editor.js +11 -2
  48. package/dist/tools/environment.d.ts +8 -14
  49. package/dist/tools/foliage.d.ts +18 -143
  50. package/dist/tools/foliage.js +4 -2
  51. package/dist/tools/handlers/actor-handlers.d.ts +1 -1
  52. package/dist/tools/handlers/actor-handlers.js +14 -13
  53. package/dist/tools/handlers/asset-handlers.js +454 -454
  54. package/dist/tools/handlers/sequence-handlers.d.ts +1 -1
  55. package/dist/tools/handlers/sequence-handlers.js +24 -13
  56. package/dist/tools/introspection.d.ts +1 -1
  57. package/dist/tools/introspection.js +1 -1
  58. package/dist/tools/landscape.d.ts +16 -116
  59. package/dist/tools/landscape.js +7 -3
  60. package/dist/tools/level.d.ts +22 -103
  61. package/dist/tools/level.js +26 -18
  62. package/dist/tools/lighting.d.ts +54 -7
  63. package/dist/tools/lighting.js +9 -5
  64. package/dist/tools/materials.d.ts +1 -1
  65. package/dist/tools/materials.js +5 -1
  66. package/dist/tools/niagara.js +37 -2
  67. package/dist/tools/performance.d.ts +0 -1
  68. package/dist/tools/performance.js +0 -1
  69. package/dist/tools/physics.js +5 -1
  70. package/dist/tools/sequence.d.ts +24 -24
  71. package/dist/tools/sequence.js +13 -0
  72. package/dist/tools/ui.d.ts +0 -2
  73. package/dist/types/automation-responses.d.ts +115 -0
  74. package/dist/types/automation-responses.js +2 -0
  75. package/dist/types/responses.d.ts +249 -0
  76. package/dist/types/responses.js +2 -0
  77. package/dist/types/tool-interfaces.d.ts +135 -135
  78. package/dist/types/tool-types.d.ts +2 -0
  79. package/dist/unreal-bridge.js +4 -4
  80. package/dist/utils/command-validator.js +7 -5
  81. package/dist/utils/error-handler.d.ts +24 -2
  82. package/dist/utils/error-handler.js +58 -23
  83. package/dist/utils/normalize.d.ts +7 -4
  84. package/dist/utils/normalize.js +12 -10
  85. package/dist/utils/path-security.d.ts +2 -0
  86. package/dist/utils/path-security.js +24 -0
  87. package/dist/utils/response-factory.d.ts +4 -4
  88. package/dist/utils/response-factory.js +15 -21
  89. package/dist/utils/response-validator.js +88 -73
  90. package/dist/utils/unreal-command-queue.d.ts +2 -0
  91. package/dist/utils/unreal-command-queue.js +8 -1
  92. package/docs/Migration-Guide-v0.5.0.md +1 -9
  93. package/docs/handler-mapping.md +4 -2
  94. package/docs/testing-guide.md +2 -2
  95. package/package.json +12 -6
  96. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +298 -33
  97. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +7 -8
  98. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +229 -319
  99. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +98 -0
  100. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +24 -0
  101. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +96 -0
  102. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +52 -5
  103. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +5 -268
  104. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +57 -2
  105. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +0 -1
  106. package/scripts/run-all-tests.mjs +25 -20
  107. package/server.json +3 -2
  108. package/src/automation/bridge.ts +27 -25
  109. package/src/automation/connection-manager.ts +18 -0
  110. package/src/automation/message-handler.ts +33 -8
  111. package/src/automation/request-tracker.ts +39 -7
  112. package/src/config.ts +1 -1
  113. package/src/constants.ts +7 -0
  114. package/src/graphql/loaders.ts +244 -0
  115. package/src/graphql/resolvers.ts +47 -49
  116. package/src/graphql/server.ts +3 -1
  117. package/src/graphql/types.ts +3 -0
  118. package/src/index.ts +15 -2
  119. package/src/resources/assets.ts +5 -4
  120. package/src/server/tool-registry.ts +3 -3
  121. package/src/server-setup.ts +3 -37
  122. package/src/tools/actors.ts +77 -44
  123. package/src/tools/animation.ts +1 -0
  124. package/src/tools/assets.ts +76 -65
  125. package/src/tools/base-tool.ts +3 -3
  126. package/src/tools/blueprint.ts +170 -104
  127. package/src/tools/consolidated-tool-definitions.ts +2 -1
  128. package/src/tools/consolidated-tool-handlers.ts +129 -150
  129. package/src/tools/dynamic-handler-registry.ts +22 -140
  130. package/src/tools/editor.ts +43 -29
  131. package/src/tools/environment.ts +21 -27
  132. package/src/tools/foliage.ts +28 -25
  133. package/src/tools/handlers/actor-handlers.ts +16 -17
  134. package/src/tools/handlers/asset-handlers.ts +484 -484
  135. package/src/tools/handlers/sequence-handlers.ts +85 -62
  136. package/src/tools/introspection.ts +7 -7
  137. package/src/tools/landscape.ts +34 -28
  138. package/src/tools/level.ts +100 -80
  139. package/src/tools/lighting.ts +25 -20
  140. package/src/tools/materials.ts +9 -3
  141. package/src/tools/niagara.ts +44 -2
  142. package/src/tools/performance.ts +1 -2
  143. package/src/tools/physics.ts +7 -1
  144. package/src/tools/sequence.ts +42 -26
  145. package/src/tools/ui.ts +1 -3
  146. package/src/types/automation-responses.ts +119 -0
  147. package/src/types/responses.ts +355 -0
  148. package/src/types/tool-interfaces.ts +135 -135
  149. package/src/types/tool-types.ts +4 -0
  150. package/src/unreal-bridge.ts +71 -26
  151. package/src/utils/command-validator.ts +47 -5
  152. package/src/utils/error-handler.ts +128 -45
  153. package/src/utils/normalize.test.ts +162 -0
  154. package/src/utils/normalize.ts +38 -16
  155. package/src/utils/path-security.ts +43 -0
  156. package/src/utils/response-factory.ts +29 -24
  157. package/src/utils/response-validator.ts +103 -87
  158. package/src/utils/safe-json.test.ts +90 -0
  159. package/src/utils/unreal-command-queue.ts +13 -1
  160. package/src/utils/validation.test.ts +184 -0
  161. package/tests/test-animation.mjs +358 -33
  162. package/tests/test-asset-graph.mjs +311 -0
  163. package/tests/test-audio.mjs +314 -116
  164. package/tests/test-behavior-tree.mjs +327 -144
  165. package/tests/test-blueprint-graph.mjs +343 -12
  166. package/tests/test-control-editor.mjs +85 -53
  167. package/tests/test-graphql.mjs +58 -8
  168. package/tests/test-input.mjs +349 -0
  169. package/tests/test-inspect.mjs +291 -61
  170. package/tests/test-landscape.mjs +304 -48
  171. package/tests/test-lighting.mjs +428 -0
  172. package/tests/test-manage-level.mjs +70 -51
  173. package/tests/test-performance.mjs +539 -0
  174. package/tests/test-sequence.mjs +82 -46
  175. package/tests/test-system.mjs +72 -33
  176. package/tests/test-wasm.mjs +98 -8
  177. package/vitest.config.ts +35 -0
  178. package/.github/release-drafter.yml +0 -148
  179. package/dist/prompts/index.d.ts +0 -21
  180. package/dist/prompts/index.js +0 -217
  181. package/dist/tools/blueprint/helpers.d.ts +0 -29
  182. package/dist/tools/blueprint/helpers.js +0 -182
  183. package/src/prompts/index.ts +0 -249
  184. package/src/tools/blueprint/helpers.ts +0 -189
  185. package/tests/test-blueprint-events.mjs +0 -35
  186. package/tests/test-extra-tools.mjs +0 -38
  187. package/tests/test-render.mjs +0 -33
  188. 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