unreal-engine-mcp-server 0.2.1 → 0.3.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.
- package/.env.production +6 -1
- package/Dockerfile +11 -28
- package/README.md +0 -17
- package/dist/index.js +108 -40
- package/dist/resources/actors.js +71 -13
- package/dist/resources/assets.d.ts +1 -1
- package/dist/resources/assets.js +3 -3
- package/dist/tools/consolidated-tool-definitions.js +278 -14
- package/dist/tools/consolidated-tool-handlers.js +5 -2
- package/dist/tools/tool-definitions.js +211 -37
- package/dist/tools/tool-handlers.js +42 -9
- package/dist/unreal-bridge.d.ts +4 -1
- package/dist/unreal-bridge.js +211 -53
- package/dist/utils/http.js +4 -2
- package/dist/utils/response-validator.js +5 -4
- package/dist/utils/safe-json.js +1 -1
- package/package.json +4 -11
- package/server.json +2 -2
- package/src/index.ts +107 -42
- package/src/resources/actors.ts +51 -13
- package/src/resources/assets.ts +3 -3
- package/src/tools/consolidated-tool-definitions.ts +278 -14
- package/src/tools/consolidated-tool-handlers.ts +6 -2
- package/src/tools/tool-definitions.ts +211 -37
- package/src/tools/tool-handlers.ts +41 -9
- package/src/unreal-bridge.ts +163 -60
- package/src/utils/http.ts +7 -4
- package/src/utils/response-validator.ts +5 -4
- package/src/utils/safe-json.ts +1 -1
|
@@ -1,9 +1,28 @@
|
|
|
1
|
-
// Consolidated tool definitions - reduced from 36 to
|
|
1
|
+
// Consolidated tool definitions - reduced from 36 to 13 multi-purpose tools
|
|
2
2
|
export const consolidatedToolDefinitions = [
|
|
3
3
|
// 1. ASSET MANAGER - Combines asset operations
|
|
4
4
|
{
|
|
5
5
|
name: 'manage_asset',
|
|
6
|
-
description:
|
|
6
|
+
description: `Search, browse, import, and create simple material assets.
|
|
7
|
+
|
|
8
|
+
When to use this tool:
|
|
9
|
+
- You want to list assets in the project Content directory (use /Game; /Content is auto-mapped).
|
|
10
|
+
- You want to import files from disk into the project (e.g., FBX, PNG, WAV, EXR).
|
|
11
|
+
- You want to generate a very basic Material asset by name at a path.
|
|
12
|
+
|
|
13
|
+
Supported actions:
|
|
14
|
+
- list: Returns assets in a folder (recursive behavior is auto-enabled for /Game).
|
|
15
|
+
- import: Imports a file into the project at a destination path (e.g., /Game/Folder).
|
|
16
|
+
- create_material: Creates a simple Material asset at a path.
|
|
17
|
+
|
|
18
|
+
Tips:
|
|
19
|
+
- Unreal uses /Game for project content; this server maps /Content → /Game automatically.
|
|
20
|
+
- For large projects, listing /Game returns a sample subset for speed; refine to subfolders.
|
|
21
|
+
|
|
22
|
+
Examples:
|
|
23
|
+
- {"action":"list","directory":"/Game/ThirdPerson"}
|
|
24
|
+
- {"action":"import","sourcePath":"C:/Temp/Tree.fbx","destinationPath":"/Game/Environment/Trees"}
|
|
25
|
+
- {"action":"create_material","name":"M_Mask","path":"/Game/Materials"}`,
|
|
7
26
|
inputSchema: {
|
|
8
27
|
type: 'object',
|
|
9
28
|
properties: {
|
|
@@ -50,7 +69,35 @@ export const consolidatedToolDefinitions = [
|
|
|
50
69
|
// 2. ACTOR CONTROL - Combines actor operations
|
|
51
70
|
{
|
|
52
71
|
name: 'control_actor',
|
|
53
|
-
description:
|
|
72
|
+
description: `Spawn, delete, and apply physics to actors in the level.
|
|
73
|
+
|
|
74
|
+
When to use this tool:
|
|
75
|
+
- Place an actor/mesh, remove an actor, or nudge an actor with a physics force.
|
|
76
|
+
|
|
77
|
+
Supported actions:
|
|
78
|
+
- spawn
|
|
79
|
+
- delete
|
|
80
|
+
- apply_force
|
|
81
|
+
|
|
82
|
+
Spawning:
|
|
83
|
+
- classPath can be a class name (e.g., StaticMeshActor, CameraActor) OR an asset path (e.g., /Engine/BasicShapes/Cube, /Game/Meshes/SM_Rock).
|
|
84
|
+
- Asset paths auto-spawn StaticMeshActor with the mesh assigned.
|
|
85
|
+
|
|
86
|
+
Deleting:
|
|
87
|
+
- Finds actors by label/name (case-insensitive) and deletes matches.
|
|
88
|
+
|
|
89
|
+
Apply force:
|
|
90
|
+
- Applies a world-space force vector to an actor with physics enabled.
|
|
91
|
+
|
|
92
|
+
Tips:
|
|
93
|
+
- classPath accepts classes or asset paths; simple names like Cube auto-resolve to engine assets.
|
|
94
|
+
- location/rotation are optional; defaults are used if omitted.
|
|
95
|
+
- For delete/apply_force, provide actorName.
|
|
96
|
+
|
|
97
|
+
Examples:
|
|
98
|
+
- {"action":"spawn","classPath":"/Engine/BasicShapes/Cube","location":{"x":0,"y":0,"z":100}}
|
|
99
|
+
- {"action":"delete","actorName":"Cube_1"}
|
|
100
|
+
- {"action":"apply_force","actorName":"PhysicsBox","force":{"x":0,"y":0,"z":5000}}`,
|
|
54
101
|
inputSchema: {
|
|
55
102
|
type: 'object',
|
|
56
103
|
properties: {
|
|
@@ -109,7 +156,26 @@ export const consolidatedToolDefinitions = [
|
|
|
109
156
|
// 3. EDITOR CONTROL - Combines editor operations
|
|
110
157
|
{
|
|
111
158
|
name: 'control_editor',
|
|
112
|
-
description:
|
|
159
|
+
description: `Play/Stop PIE, position the editor camera, and switch common view modes.
|
|
160
|
+
|
|
161
|
+
When to use this tool:
|
|
162
|
+
- Start/stop a PIE session, move the viewport camera, or change viewmode (Lit/Unlit/Wireframe/etc.).
|
|
163
|
+
|
|
164
|
+
Supported actions:
|
|
165
|
+
- play
|
|
166
|
+
- stop
|
|
167
|
+
- set_camera
|
|
168
|
+
- set_view_mode
|
|
169
|
+
|
|
170
|
+
Notes:
|
|
171
|
+
- View modes are validated; unsafe modes are blocked.
|
|
172
|
+
- Camera accepts location/rotation (optional); values normalized.
|
|
173
|
+
|
|
174
|
+
Examples:
|
|
175
|
+
- {"action":"play"}
|
|
176
|
+
- {"action":"set_camera","location":{"x":0,"y":-600,"z":250},"rotation":{"pitch":0,"yaw":0,"roll":0}}
|
|
177
|
+
- {"action":"set_view_mode","viewMode":"Wireframe"}
|
|
178
|
+
- {"action":"stop"}`,
|
|
113
179
|
inputSchema: {
|
|
114
180
|
type: 'object',
|
|
115
181
|
properties: {
|
|
@@ -166,7 +232,28 @@ export const consolidatedToolDefinitions = [
|
|
|
166
232
|
// 4. LEVEL MANAGER - Combines level and lighting operations
|
|
167
233
|
{
|
|
168
234
|
name: 'manage_level',
|
|
169
|
-
description:
|
|
235
|
+
description: `Load/save/stream levels, create lights, and trigger lighting builds.
|
|
236
|
+
|
|
237
|
+
When to use this tool:
|
|
238
|
+
- Switch to a level, save the current level, stream sublevels, add a light, or start a lighting build.
|
|
239
|
+
|
|
240
|
+
Supported actions:
|
|
241
|
+
- load
|
|
242
|
+
- save
|
|
243
|
+
- stream
|
|
244
|
+
- create_light
|
|
245
|
+
- build_lighting
|
|
246
|
+
|
|
247
|
+
Tips:
|
|
248
|
+
- Use /Game paths for levels (e.g., /Game/Maps/Level).
|
|
249
|
+
- For streaming, set shouldBeLoaded and shouldBeVisible accordingly.
|
|
250
|
+
- For lights, provide lightType and optional location/intensity.
|
|
251
|
+
|
|
252
|
+
Examples:
|
|
253
|
+
- {"action":"load","levelPath":"/Game/Maps/Lobby"}
|
|
254
|
+
- {"action":"stream","levelName":"Sublevel_A","shouldBeLoaded":true,"shouldBeVisible":true}
|
|
255
|
+
- {"action":"create_light","lightType":"Directional","name":"KeyLight","intensity":5.0}
|
|
256
|
+
- {"action":"build_lighting","quality":"High"}`,
|
|
170
257
|
inputSchema: {
|
|
171
258
|
type: 'object',
|
|
172
259
|
properties: {
|
|
@@ -221,7 +308,25 @@ export const consolidatedToolDefinitions = [
|
|
|
221
308
|
// 5. ANIMATION SYSTEM - Combines animation and physics setup
|
|
222
309
|
{
|
|
223
310
|
name: 'animation_physics',
|
|
224
|
-
description:
|
|
311
|
+
description: `Create animation blueprints, play montages, and set up simple ragdolls.
|
|
312
|
+
|
|
313
|
+
When to use this tool:
|
|
314
|
+
- Generate an Anim Blueprint for a skeleton, play a Montage/Animation on an actor, or enable ragdoll.
|
|
315
|
+
|
|
316
|
+
Supported actions:
|
|
317
|
+
- create_animation_bp
|
|
318
|
+
- play_montage
|
|
319
|
+
- setup_ragdoll
|
|
320
|
+
|
|
321
|
+
Tips:
|
|
322
|
+
- Ensure the montage/animation is compatible with the target actor/skeleton.
|
|
323
|
+
- setup_ragdoll requires a valid physicsAssetName on the skeleton.
|
|
324
|
+
- Use savePath when creating new assets.
|
|
325
|
+
|
|
326
|
+
Examples:
|
|
327
|
+
- {"action":"create_animation_bp","name":"ABP_Hero","skeletonPath":"/Game/Characters/Hero/SK_Hero_Skeleton","savePath":"/Game/Characters/Hero"}
|
|
328
|
+
- {"action":"play_montage","actorName":"Hero","montagePath":"/Game/Anim/MT_Attack"}
|
|
329
|
+
- {"action":"setup_ragdoll","skeletonPath":"/Game/Characters/Hero/SK_Hero_Skeleton","physicsAssetName":"PHYS_Hero"}`,
|
|
225
330
|
inputSchema: {
|
|
226
331
|
type: 'object',
|
|
227
332
|
properties: {
|
|
@@ -260,7 +365,24 @@ export const consolidatedToolDefinitions = [
|
|
|
260
365
|
// 6. EFFECTS SYSTEM - Combines particles and visual effects
|
|
261
366
|
{
|
|
262
367
|
name: 'create_effect',
|
|
263
|
-
description:
|
|
368
|
+
description: `Create particles/FX and lightweight debug shapes for rapid iteration.
|
|
369
|
+
|
|
370
|
+
When to use this tool:
|
|
371
|
+
- Spawn a Niagara system at a location, create a particle effect by type tag, or draw debug geometry for planning.
|
|
372
|
+
|
|
373
|
+
Supported actions:
|
|
374
|
+
- particle
|
|
375
|
+
- niagara
|
|
376
|
+
- debug_shape
|
|
377
|
+
|
|
378
|
+
Tips:
|
|
379
|
+
- Set color as RGBA [r,g,b,a]; scale defaults to 1 if omitted.
|
|
380
|
+
- Use debug shapes for quick layout planning and measurements.
|
|
381
|
+
|
|
382
|
+
Examples:
|
|
383
|
+
- {"action":"niagara","systemPath":"/Game/FX/NS_Explosion","location":{"x":0,"y":0,"z":200},"scale":1.0}
|
|
384
|
+
- {"action":"particle","effectType":"Smoke","name":"SMK1","location":{"x":100,"y":0,"z":50}}
|
|
385
|
+
- {"action":"debug_shape","shape":"Sphere","location":{"x":0,"y":0,"z":0},"size":100,"duration":5}`,
|
|
264
386
|
inputSchema: {
|
|
265
387
|
type: 'object',
|
|
266
388
|
properties: {
|
|
@@ -320,7 +442,22 @@ export const consolidatedToolDefinitions = [
|
|
|
320
442
|
// 7. BLUEPRINT MANAGER - Blueprint operations
|
|
321
443
|
{
|
|
322
444
|
name: 'manage_blueprint',
|
|
323
|
-
description:
|
|
445
|
+
description: `Create new Blueprints and add components programmatically.
|
|
446
|
+
|
|
447
|
+
When to use this tool:
|
|
448
|
+
- Quickly scaffold a Blueprint asset or add a component to an existing Blueprint.
|
|
449
|
+
|
|
450
|
+
Supported actions:
|
|
451
|
+
- create
|
|
452
|
+
- add_component
|
|
453
|
+
|
|
454
|
+
Tips:
|
|
455
|
+
- blueprintType can be Actor, Pawn, Character, etc.
|
|
456
|
+
- Component names should be unique within the Blueprint.
|
|
457
|
+
|
|
458
|
+
Examples:
|
|
459
|
+
- {"action":"create","name":"BP_Switch","blueprintType":"Actor","savePath":"/Game/Blueprints"}
|
|
460
|
+
- {"action":"add_component","name":"BP_Switch","componentType":"PointLightComponent","componentName":"KeyLight"}`,
|
|
324
461
|
inputSchema: {
|
|
325
462
|
type: 'object',
|
|
326
463
|
properties: {
|
|
@@ -354,7 +491,28 @@ export const consolidatedToolDefinitions = [
|
|
|
354
491
|
// 8. ENVIRONMENT BUILDER - Landscape and foliage
|
|
355
492
|
{
|
|
356
493
|
name: 'build_environment',
|
|
357
|
-
description:
|
|
494
|
+
description: `Environment authoring helpers (landscape, foliage).
|
|
495
|
+
|
|
496
|
+
When to use this tool:
|
|
497
|
+
- Create a procedural terrain alternative, add/paint foliage, or attempt a landscape workflow.
|
|
498
|
+
|
|
499
|
+
Supported actions:
|
|
500
|
+
- create_landscape
|
|
501
|
+
- sculpt
|
|
502
|
+
- add_foliage
|
|
503
|
+
- paint_foliage
|
|
504
|
+
|
|
505
|
+
Important:
|
|
506
|
+
- Native Landscape creation via Python is limited and may return a helpful error suggesting Landscape Mode in the editor.
|
|
507
|
+
- Foliage helpers create FoliageType assets and support simple placement.
|
|
508
|
+
|
|
509
|
+
Tips:
|
|
510
|
+
- Adjust brushSize and strength to tune sculpting results.
|
|
511
|
+
|
|
512
|
+
Examples:
|
|
513
|
+
- {"action":"create_landscape","name":"Landscape_Basic","sizeX":1024,"sizeY":1024}
|
|
514
|
+
- {"action":"add_foliage","name":"FT_Grass","meshPath":"/Game/Foliage/SM_Grass","density":300}
|
|
515
|
+
- {"action":"paint_foliage","foliageType":"/Game/Foliage/Types/FT_Grass","position":{"x":0,"y":0,"z":0},"brushSize":300}`,
|
|
358
516
|
inputSchema: {
|
|
359
517
|
type: 'object',
|
|
360
518
|
properties: {
|
|
@@ -404,7 +562,31 @@ export const consolidatedToolDefinitions = [
|
|
|
404
562
|
// 9. PERFORMANCE & AUDIO - System settings
|
|
405
563
|
{
|
|
406
564
|
name: 'system_control',
|
|
407
|
-
description:
|
|
565
|
+
description: `Performance toggles, quality settings, audio playback, simple UI helpers, screenshots, and engine lifecycle.
|
|
566
|
+
|
|
567
|
+
When to use this tool:
|
|
568
|
+
- Toggle profiling and FPS stats, adjust quality (sg.*), play a sound, create/show a basic widget, take a screenshot, or launch/quit the editor.
|
|
569
|
+
|
|
570
|
+
Supported actions:
|
|
571
|
+
- profile
|
|
572
|
+
- show_fps
|
|
573
|
+
- set_quality
|
|
574
|
+
- play_sound
|
|
575
|
+
- create_widget
|
|
576
|
+
- show_widget
|
|
577
|
+
- screenshot
|
|
578
|
+
- engine_start
|
|
579
|
+
- engine_quit
|
|
580
|
+
|
|
581
|
+
Tips:
|
|
582
|
+
- Screenshot resolution format: 1920x1080.
|
|
583
|
+
- engine_start can read UE project path from env; provide editorExe/projectPath if needed.
|
|
584
|
+
|
|
585
|
+
Examples:
|
|
586
|
+
- {"action":"show_fps","enabled":true}
|
|
587
|
+
- {"action":"set_quality","category":"Shadows","level":2}
|
|
588
|
+
- {"action":"play_sound","soundPath":"/Game/Audio/SFX/Click","volume":0.5}
|
|
589
|
+
- {"action":"screenshot","resolution":"1920x1080"}`,
|
|
408
590
|
inputSchema: {
|
|
409
591
|
type: 'object',
|
|
410
592
|
properties: {
|
|
@@ -473,7 +655,22 @@ export const consolidatedToolDefinitions = [
|
|
|
473
655
|
// 10. CONSOLE COMMAND - Universal tool
|
|
474
656
|
{
|
|
475
657
|
name: 'console_command',
|
|
476
|
-
description:
|
|
658
|
+
description: `Execute an Unreal console command with built-in safety.
|
|
659
|
+
|
|
660
|
+
When to use this tool:
|
|
661
|
+
- Fire a specific command (e.g., stat fps, viewmode wireframe, r.ScreenPercentage 75).
|
|
662
|
+
|
|
663
|
+
Safety:
|
|
664
|
+
- Dangerous commands are blocked (quit/exit, GPU crash triggers, unsafe visualizebuffer modes, etc.).
|
|
665
|
+
- Unknown commands will return a warning instead of crashing.
|
|
666
|
+
|
|
667
|
+
Tips:
|
|
668
|
+
- Prefer dedicated tools (system_control, control_editor) when available for structured control.
|
|
669
|
+
|
|
670
|
+
Examples:
|
|
671
|
+
- {"command":"stat fps"}
|
|
672
|
+
- {"command":"viewmode wireframe"}
|
|
673
|
+
- {"command":"r.ScreenPercentage 75"}`,
|
|
477
674
|
inputSchema: {
|
|
478
675
|
type: 'object',
|
|
479
676
|
properties: {
|
|
@@ -496,7 +693,29 @@ export const consolidatedToolDefinitions = [
|
|
|
496
693
|
// 11. REMOTE CONTROL PRESETS
|
|
497
694
|
{
|
|
498
695
|
name: 'manage_rc',
|
|
499
|
-
description:
|
|
696
|
+
description: `Create and manage Remote Control presets; expose actors/properties; set/get values.
|
|
697
|
+
|
|
698
|
+
When to use this tool:
|
|
699
|
+
- Automate Remote Control (RC) preset authoring and interaction from the assistant.
|
|
700
|
+
|
|
701
|
+
Supported actions:
|
|
702
|
+
- create_preset
|
|
703
|
+
- expose_actor
|
|
704
|
+
- expose_property
|
|
705
|
+
- list_fields
|
|
706
|
+
- set_property
|
|
707
|
+
- get_property
|
|
708
|
+
|
|
709
|
+
Tips:
|
|
710
|
+
- value must be JSON-serializable.
|
|
711
|
+
- Use objectPath/presetPath with full asset/object paths.
|
|
712
|
+
|
|
713
|
+
Examples:
|
|
714
|
+
- {"action":"create_preset","name":"LivePreset","path":"/Game/RCPresets"}
|
|
715
|
+
- {"action":"expose_actor","presetPath":"/Game/RCPresets/LivePreset","actorName":"CameraActor"}
|
|
716
|
+
- {"action":"expose_property","presetPath":"/Game/RCPresets/LivePreset","objectPath":"/Script/Engine.Default__Engine","propertyName":"GameUserSettings"}
|
|
717
|
+
- {"action":"list_fields","presetPath":"/Game/RCPresets/LivePreset"}
|
|
718
|
+
- {"action":"set_property","objectPath":"/Game/MyActor","propertyName":"CustomFloat","value":0.5}`,
|
|
500
719
|
inputSchema: {
|
|
501
720
|
type: 'object',
|
|
502
721
|
properties: {
|
|
@@ -530,7 +749,37 @@ export const consolidatedToolDefinitions = [
|
|
|
530
749
|
// 12. SEQUENCER / CINEMATICS
|
|
531
750
|
{
|
|
532
751
|
name: 'manage_sequence',
|
|
533
|
-
description:
|
|
752
|
+
description: `Create/open Level Sequences, bind actors, add cameras, and control playback.
|
|
753
|
+
|
|
754
|
+
When to use this tool:
|
|
755
|
+
- Build quick cinematics: create/open a sequence, add a camera or actors, tweak properties, and play.
|
|
756
|
+
|
|
757
|
+
Supported actions:
|
|
758
|
+
- create
|
|
759
|
+
- open
|
|
760
|
+
- add_camera
|
|
761
|
+
- add_actor
|
|
762
|
+
- add_actors
|
|
763
|
+
- remove_actors
|
|
764
|
+
- get_bindings
|
|
765
|
+
- add_spawnable_from_class
|
|
766
|
+
- play
|
|
767
|
+
- pause
|
|
768
|
+
- stop
|
|
769
|
+
- set_properties
|
|
770
|
+
- get_properties
|
|
771
|
+
- set_playback_speed
|
|
772
|
+
|
|
773
|
+
Tips:
|
|
774
|
+
- Set spawnable=true to auto-create a camera actor.
|
|
775
|
+
- Use frameRate/lengthInFrames to define timing; use playbackStart/End to trim.
|
|
776
|
+
|
|
777
|
+
Examples:
|
|
778
|
+
- {"action":"create","name":"Intro","path":"/Game/Cinematics"}
|
|
779
|
+
- {"action":"add_camera","spawnable":true}
|
|
780
|
+
- {"action":"add_actor","actorName":"Hero"}
|
|
781
|
+
- {"action":"play","loopMode":"once"}
|
|
782
|
+
- {"action":"set_properties","path":"/Game/Cinematics/Intro","frameRate":24,"lengthInFrames":480}`,
|
|
534
783
|
inputSchema: {
|
|
535
784
|
type: 'object',
|
|
536
785
|
properties: {
|
|
@@ -582,7 +831,22 @@ export const consolidatedToolDefinitions = [
|
|
|
582
831
|
// 13. INTROSPECTION
|
|
583
832
|
{
|
|
584
833
|
name: 'inspect',
|
|
585
|
-
description:
|
|
834
|
+
description: `Read object info and set properties with validation.
|
|
835
|
+
|
|
836
|
+
When to use this tool:
|
|
837
|
+
- Inspect an object by path (class default object or actor/component) and optionally modify properties.
|
|
838
|
+
|
|
839
|
+
Supported actions:
|
|
840
|
+
- inspect_object
|
|
841
|
+
- set_property
|
|
842
|
+
|
|
843
|
+
Tips:
|
|
844
|
+
- propertyName is case-sensitive; ensure it exists on the target object.
|
|
845
|
+
- For class default objects (CDOs), use the /Script/...Default__Class path.
|
|
846
|
+
|
|
847
|
+
Examples:
|
|
848
|
+
- {"action":"inspect_object","objectPath":"/Script/Engine.Default__Engine"}
|
|
849
|
+
- {"action":"set_property","objectPath":"/Game/MyActor","propertyName":"CustomBool","value":true}`,
|
|
586
850
|
inputSchema: {
|
|
587
851
|
type: 'object',
|
|
588
852
|
properties: {
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
// Consolidated tool handlers - maps
|
|
1
|
+
// Consolidated tool handlers - maps 13 tools to all 36 operations
|
|
2
2
|
import { handleToolCall } from './tool-handlers.js';
|
|
3
3
|
import { cleanObject } from '../utils/safe-json.js';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
const log = new Logger('ConsolidatedToolHandler');
|
|
4
6
|
export async function handleConsolidatedToolCall(name, args, tools) {
|
|
5
7
|
const startTime = Date.now();
|
|
6
|
-
|
|
8
|
+
// Use scoped logger (stderr) to avoid polluting stdout JSON
|
|
9
|
+
log.debug(`Starting execution of ${name} at ${new Date().toISOString()}`);
|
|
7
10
|
try {
|
|
8
11
|
// Validate args is not null/undefined
|
|
9
12
|
if (args === null || args === undefined) {
|