Description:
When running farm-runner on Windows, the process fails to spawn Appium with the error
spawn appium ENOENT
. Appium is installed globally and accessible via PATH, and works from the command prompt. The issue persists even after explicitly setting PATH and running as Administrator.
Scenario:
- Hub is setup on machine A (MAC machine)
- Node is setup on machine B (Window machine) and connected with physical real devices.
- Access the device farm Ui from client machine C and launch the device ui
Error logs:
process fails to spawn Appium with the error˙
C:\Users\LabMachine>farm-runner -c C:\newserver\nodeconfig.json
✅ OpenTelemetry initialized for farm-runner (tracing: enabled)
✅ OpenTelemetry logging initialized for farm-runner
(node:14700) [DEP0040] DeprecationWarning: The punycode module is deprecated. Please use a userland alternative instead.
(Use node --trace-deprecation ... to show where the warning was created)
{"timestamp":"2026-04-22T19:44:36.852Z","level":"info","service":"node","message":"🚀 Initializing session log storage service","args":[{"hubUrl":"http://wchmdhsn07025.qvcdev.qvc.net:3000"}]}
{"timestamp":"2026-04-22T19:44:36.855Z","level":"info","service":"node","message":"📤 Hub log uploader initialized","args":[{"hubBaseUrl":"http://wchmdhsn07025.qvcdev.qvc.net:3000"}]}
✅ Session log storage initialized (uploading to hub: http://wchmdhsn07025.qvcdev.qvc.net:3000)
✅ Hub is reachable for log uploads
📋 Using config file: C:\newserver\nodeconfig.json
📡 Registering node with hub...
Hub URL: http://wchmdhsn07025.qvcdev.qvc.net:3000
Node Name: windows
Host: 10.24.170.46:3003 (IP:PORT)
OS: Windows
✅ Node registered successfully with ID: bb97cf8f-adf5-4891-9379-b93a75f9d7b2
{"timestamp":"2026-04-22T19:44:37.101Z","level":"info","service":"node","message":"📱 Initializing Device Managers...","args":[]}
{"timestamp":"2026-04-22T19:44:37.103Z","level":"info","service":"node","message":"🤖 Initializing Android device manager...","args":[]}
{"timestamp":"2026-04-22T19:44:37.107Z","level":"info","service":"node","message":"🔍 Fetching devices...","args":[]}
{"timestamp":"2026-04-22T19:44:37.121Z","level":"info","service":"node","message":"Fetching existing devices from hub to avoid re-querying details...","args":[]}
{"timestamp":"2026-04-22T19:44:37.154Z","level":"info","service":"node","message":"No existing devices found in hub. So, querying connected devices.","args":[]}
info ADB Found 1 'build-tools' folders under 'C:\Users\LabMachine\AppData\Local\Android\Sdk' (newest first):
info ADB C:\Users\LabMachine\AppData\Local\Android\Sdk\build-tools\34.0.0
info ADB Using 'adb.exe' from 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 start-server'
dbug ADB Getting connected devices
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
{"timestamp":"2026-04-22T19:44:37.499Z","level":"info","service":"node","message":"Android Device details for R52RB08X6QJ not available. So querying now.","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell getprop ro.build.version.release'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell getprop ro.build.characteristics'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell dumpsys package com.android.chrome'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell wm size'
{"timestamp":"2026-04-22T19:44:38.596Z","level":"info","service":"node","message":"Screen dimension for device R52RB08X6QJ : Physical size: 1600x2560","args":[]}
{"timestamp":"2026-04-22T19:44:38.600Z","level":"info","service":"node","message":"Parsed screen dimension for device R52RB08X6QJ : 1600x2560","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell dumpsys bluetooth_manager | grep name: | cut -c9- | head -n 1'
{"timestamp":"2026-04-22T19:44:38.970Z","level":"info","service":"node","message":"Android Device details for R52W509PMWH not available. So querying now.","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell getprop ro.build.version.release'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell getprop ro.build.characteristics'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell dumpsys package com.android.chrome'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell wm size'
{"timestamp":"2026-04-22T19:44:39.817Z","level":"info","service":"node","message":"Screen dimension for device R52W509PMWH : Physical size: 1848x2960","args":[]}
{"timestamp":"2026-04-22T19:44:39.818Z","level":"info","service":"node","message":"Parsed screen dimension for device R52W509PMWH : 1848x2960","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell dumpsys bluetooth_manager | grep name: | cut -c9- | head -n 1'
{"timestamp":"2026-04-22T19:44:40.252Z","level":"info","service":"node","message":"Found 2 android devices","args":[]}
{"timestamp":"2026-04-22T19:44:40.254Z","level":"info","service":"node","message":"✅ Found 2 Android device(s)","args":[]}
[DeviceHubService] 🔍 Checking for existing devices in hub...
[DeviceHubService] 📤 Sending 2 new device(s) to hub (0 already exist and are active)
[DeviceHubService] ✅ Successfully sent 2 new device(s) to hub: R52RB08X6QJ, R52W509PMWH
{"timestamp":"2026-04-22T19:44:40.350Z","level":"info","service":"node","message":"🔄 Starting DeviceReconciliationService (interval: 60000ms)","args":[]}
{"timestamp":"2026-04-22T19:44:40.356Z","level":"info","service":"node","message":"✅ Device reconciliation service started (interval: 60000ms)","args":[]}
dbug ADB Getting connected devices
🔌 Connecting to hub Socket.IO: http://wchmdhsn07025.qvcdev.qvc.net:3000
🚀 Node server is running on http://localhost:3003
📚 API endpoints available at http://localhost:3003/api
Available endpoints:
GET /health
✅ Socket.IO connected to hub (node: bb97cf8f...)
💓 Socket.IO heartbeat established with hub (node: bb97cf8f...)
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
{"timestamp":"2026-04-22T19:45:40.030Z","level":"info","service":"node","message":"Received createSession event from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionData":{"capabilities":{"alwaysMatch":{"df:deviceId":"9fd0a9f0-46cf-5874-8e36-cbcc6ff841ca","df:sessionType":"manual","appium:settings":{"mjpegServerScreenshotQuality":0,"mjpegServerFramerate":10,"mjpegScalingFactor":100,"animationCoolOffTimeout":0},"platformName":"android","appium:automationName":"uiautomator2","appium:newCommandTimeout":"0"}},"tempSessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","deviceUdid":"R52RB08X6QJ","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","method":"POST","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}}
{"timestamp":"2026-04-22T19:45:40.043Z","level":"info","service":"node","message":"Processing device capabilities...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}
{"timestamp":"2026-04-22T19:45:40.047Z","level":"info","service":"node","message":"Looking up device information for UDID","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceUdid":"R52RB08X6QJ"}
dbug ADB Getting connected devices
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
{"timestamp":"2026-04-22T19:45:40.160Z","level":"info","service":"node","message":"Android Device details for R52RB08X6QJ already available","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","args":[]}
{"timestamp":"2026-04-22T19:45:40.163Z","level":"info","service":"node","message":"Android Device details for R52W509PMWH already available","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","args":[]}
{"timestamp":"2026-04-22T19:45:40.168Z","level":"info","service":"node","message":"Found 2 android devices","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","args":[]}
{"timestamp":"2026-04-22T19:45:40.171Z","level":"info","service":"node","message":"Found device","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceName":"GalaxyTabS7_wchwlqvch00726","platform":"android","version":"12"}
{"timestamp":"2026-04-22T19:45:40.175Z","level":"info","service":"node","message":"Processing Android capabilities","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","caps":{"alwaysMatch":{"df:deviceId":"9fd0a9f0-46cf-5874-8e36-cbcc6ff841ca","df:sessionType":"manual","appium:settings":{"mjpegServerScreenshotQuality":0,"mjpegServerFramerate":10,"mjpegScalingFactor":100,"animationCoolOffTimeout":0},"platformName":"android","appium:automationName":"uiautomator2","appium:newCommandTimeout":"0"},"firstMatch":[{}]}}
{"timestamp":"2026-04-22T19:45:40.215Z","level":"info","service":"node","message":"Processed capabilities with device-specific information","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","note":"using random free ports","allocatedPorts":[8902,8903]}
{"timestamp":"2026-04-22T19:45:40.216Z","level":"info","service":"node","message":"Resolving app resources...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}
{"timestamp":"2026-04-22T19:45:40.244Z","level":"info","service":"node","message":"WDA handling check","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceUdid":"R52RB08X6QJ","devicePlatform":"android","runsOn":"undefined","isIosReal":false,"wdaId":"undefined"}
{"timestamp":"2026-04-22T19:45:40.245Z","level":"info","service":"node","message":"No wdaId in capabilities; checking device-specific WDA mapping","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceUdid":"R52RB08X6QJ"}
{"timestamp":"2026-04-22T19:45:40.265Z","level":"info","service":"node","message":"Requesting device-specific WDA from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","udid":"R52RB08X6QJ","url":"http://wchmdhsn07025.qvcdev.qvc.net:3000/api/wda/device/udid/R52RB08X6QJ"}
{"timestamp":"2026-04-22T19:45:40.305Z","level":"info","service":"node","message":"No device-specific WDA found; fetching default WDA from hub for device type","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceType":"simulator","isIosReal":false,"deviceUdid":"R52RB08X6QJ"}
{"timestamp":"2026-04-22T19:45:40.315Z","level":"info","service":"node","message":"Requesting default WDA from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceType":"simulator","url":"http://wchmdhsn07025.qvcdev.qvc.net:3000/api/wda/default?deviceType=simulator"}
{"timestamp":"2026-04-22T19:45:40.344Z","level":"warn","service":"node","message":"Failed to fetch default WDA from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","statusCode":404}
{"timestamp":"2026-04-22T19:45:40.345Z","level":"warn","service":"node","message":"No WDA ID available (explicit or default) for iOS real device; skipping WDA installation","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.350Z","level":"info","service":"node","message":"WDA capabilities not set - platform is not iOS","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","devicePlatform":"android","wdaBundleId":"undefined","wdaLocalPath":"undefined"}
{"timestamp":"2026-04-22T19:45:40.361Z","level":"info","service":"node","message":"Detected manual session, injecting MJPEG server port and quality settings","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","isManualSession":true,"isRecordVideoEnabled":false}
{"timestamp":"2026-04-22T19:45:40.388Z","level":"info","service":"node","message":"Allocated new MJPEG port","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","mjpegPort":10000}
{"timestamp":"2026-04-22T19:45:40.390Z","level":"info","service":"node","message":"Injected MJPEG server port and quality settings","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","mjpegPort":10000,"settings":{"mjpegServerScreenshotQuality":25,"mjpegServerFramerate":10,"mjpegScalingFactor":100}}
{"timestamp":"2026-04-22T19:45:40.391Z","level":"info","service":"node","message":"Starting Appium server...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}
{"timestamp":"2026-04-22T19:45:40.393Z","level":"info","service":"node","message":"Starting dedicated Appium server for session...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.402Z","level":"info","service":"node","message":"📋 Session create request received: temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.405Z","level":"info","service":"node","message":"🚀 Starting Appium server for session...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.409Z","level":"info","service":"node","message":"📝 Session log file (default): C:\Users\LabMachine\tmp\temp-d2ed8fff-3e05-4440-aabf-126ffcc29012\appium.log","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.426Z","level":"info","service":"node","message":"📝 Using default Appium log level: debug (for maximum log visibility)","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.455Z","level":"info","service":"node","message":"🚀 Starting Appium server as child process","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","command":"appium","args":["--port","9000","--address","127.0.0.1","--use-drivers","uiautomator2","--allow-cors","--relaxed-security","--log","C:\Users\LabMachine\tmp\temp-d2ed8fff-3e05-4440-aabf-126ffcc29012\appium.log","--log-level","debug","--log-timestamp"],"port":9000,"sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.459Z","level":"info","service":"node","message":"👀 Started monitoring Appium process stdio for pattern matching","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.463Z","level":"error","service":"node","message":"❌ Failed to start Appium process","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"spawn appium ENOENT"}
{"timestamp":"2026-04-22T19:45:40.552Z","level":"error","service":"node","message":"❌ Failed to start Appium server for session","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"Failed to spawn Appium: spawn appium ENOENT","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.555Z","level":"error","service":"node","message":"❌ Failed to start Appium server","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"Failed to spawn Appium: spawn appium ENOENT"}
{"timestamp":"2026-04-22T19:45:40.566Z","level":"info","service":"node","message":"Released allocated ports","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","ports":[8902,8903]}
{"timestamp":"2026-04-22T19:45:40.576Z","level":"info","service":"node","message":"Cleaning up session resources","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","reason":"session creation error"}
{"timestamp":"2026-04-22T19:45:40.587Z","level":"info","service":"node","message":"📋 Session delete request received: temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.589Z","level":"info","service":"node","message":"🔍 Searching for session","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","searchId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","activeSessions":[],"totalSessions":0}
{"timestamp":"2026-04-22T19:45:40.590Z","level":"warn","service":"node","message":"❌ No session found for ID","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.590Z","level":"warn","service":"node","message":"⏭️ Session temp-d2ed8fff-3e05-4440-aabf-126ffcc29012 not in active sessions (already deleted)","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","activeSessions":[]}
{"timestamp":"2026-04-22T19:45:40.591Z","level":"info","service":"node","message":"Stopped Appium server during cleanup","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","tempSessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.593Z","level":"error","service":"node","message":"Non-Appium error during session creation","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT","stack":"Error: Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT\n at _0xe40c20 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18480565)\n at processTicksAndRejections (node:internal/process/task_queues:104:5)\n at _0x4204bd (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18699311)\n at _0x45c475 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18808984)\n at C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31357549\n at Socket. (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31355674)"}
{"timestamp":"2026-04-22T19:45:40.595Z","level":"info","service":"node","message":"Forwarding error response back to hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","status":400,"data":{"value":{"error":"unknown error","message":"Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT","stacktrace":"Error: Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT\n at _0xe40c20 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18480565)\n at processTicksAndRejections (node:internal/process/task_queues:104:5)\n at _0x4204bd (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18699311)\n at _0x45c475 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18808984)\n at C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31357549\n at Socket. (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31355674)"}}}
dbug ADB Getting connected devices
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
SIGINT received, shutting down gracefully...
🔌 Socket.IO disconnected (shutdown)
🛑 Socket.IO heartbeat stopped
{"timestamp":"2026-04-22T19:45:48.085Z","level":"info","service":"node","message":"🧹 Cleaning up Appium session manager..."}
{"timestamp":"2026-04-22T19:45:48.087Z","level":"info","service":"node","message":"✅ Cleanup complete"}
{"timestamp":"2026-04-22T19:45:48.090Z","level":"info","service":"node","message":"🛑 DeviceReconciliationService stopped","args":[]}
OpenTelemetry SDK shut down
Description:
When running farm-runner on Windows, the process fails to spawn Appium with the error
spawn appium ENOENT
. Appium is installed globally and accessible via PATH, and works from the command prompt. The issue persists even after explicitly setting PATH and running as Administrator.
Scenario:
Error logs:
process fails to spawn Appium with the error˙
C:\Users\LabMachine>farm-runner -c C:\newserver\nodeconfig.json
✅ OpenTelemetry initialized for farm-runner (tracing: enabled)
✅ OpenTelemetry logging initialized for farm-runner
(node:14700) [DEP0040] DeprecationWarning: The
punycodemodule is deprecated. Please use a userland alternative instead.(Use
node --trace-deprecation ...to show where the warning was created){"timestamp":"2026-04-22T19:44:36.852Z","level":"info","service":"node","message":"🚀 Initializing session log storage service","args":[{"hubUrl":"http://wchmdhsn07025.qvcdev.qvc.net:3000"}]}
{"timestamp":"2026-04-22T19:44:36.855Z","level":"info","service":"node","message":"📤 Hub log uploader initialized","args":[{"hubBaseUrl":"http://wchmdhsn07025.qvcdev.qvc.net:3000"}]}
✅ Session log storage initialized (uploading to hub: http://wchmdhsn07025.qvcdev.qvc.net:3000)
✅ Hub is reachable for log uploads
📋 Using config file: C:\newserver\nodeconfig.json
📡 Registering node with hub...
Hub URL: http://wchmdhsn07025.qvcdev.qvc.net:3000
Node Name: windows
Host: 10.24.170.46:3003 (IP:PORT)
OS: Windows
✅ Node registered successfully with ID: bb97cf8f-adf5-4891-9379-b93a75f9d7b2
{"timestamp":"2026-04-22T19:44:37.101Z","level":"info","service":"node","message":"📱 Initializing Device Managers...","args":[]}
{"timestamp":"2026-04-22T19:44:37.103Z","level":"info","service":"node","message":"🤖 Initializing Android device manager...","args":[]}
{"timestamp":"2026-04-22T19:44:37.107Z","level":"info","service":"node","message":"🔍 Fetching devices...","args":[]}
{"timestamp":"2026-04-22T19:44:37.121Z","level":"info","service":"node","message":"Fetching existing devices from hub to avoid re-querying details...","args":[]}
{"timestamp":"2026-04-22T19:44:37.154Z","level":"info","service":"node","message":"No existing devices found in hub. So, querying connected devices.","args":[]}
info ADB Found 1 'build-tools' folders under 'C:\Users\LabMachine\AppData\Local\Android\Sdk' (newest first):
info ADB C:\Users\LabMachine\AppData\Local\Android\Sdk\build-tools\34.0.0
info ADB Using 'adb.exe' from 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 start-server'
dbug ADB Getting connected devices
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
{"timestamp":"2026-04-22T19:44:37.499Z","level":"info","service":"node","message":"Android Device details for R52RB08X6QJ not available. So querying now.","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell getprop ro.build.version.release'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell getprop ro.build.characteristics'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell dumpsys package com.android.chrome'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell wm size'
{"timestamp":"2026-04-22T19:44:38.596Z","level":"info","service":"node","message":"Screen dimension for device R52RB08X6QJ : Physical size: 1600x2560","args":[]}
{"timestamp":"2026-04-22T19:44:38.600Z","level":"info","service":"node","message":"Parsed screen dimension for device R52RB08X6QJ : 1600x2560","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52RB08X6QJ shell dumpsys bluetooth_manager | grep name: | cut -c9- | head -n 1'
{"timestamp":"2026-04-22T19:44:38.970Z","level":"info","service":"node","message":"Android Device details for R52W509PMWH not available. So querying now.","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell getprop ro.build.version.release'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell getprop ro.build.characteristics'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell dumpsys package com.android.chrome'
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell wm size'
{"timestamp":"2026-04-22T19:44:39.817Z","level":"info","service":"node","message":"Screen dimension for device R52W509PMWH : Physical size: 1848x2960","args":[]}
{"timestamp":"2026-04-22T19:44:39.818Z","level":"info","service":"node","message":"Parsed screen dimension for device R52W509PMWH : 1848x2960","args":[]}
dbug ADB Running 'C:\Users\LabMachine\AppData\Local\Android\Sdk\platform-tools\adb.exe -P 5037 -s R52W509PMWH shell dumpsys bluetooth_manager | grep name: | cut -c9- | head -n 1'
{"timestamp":"2026-04-22T19:44:40.252Z","level":"info","service":"node","message":"Found 2 android devices","args":[]}
{"timestamp":"2026-04-22T19:44:40.254Z","level":"info","service":"node","message":"✅ Found 2 Android device(s)","args":[]}
[DeviceHubService] 🔍 Checking for existing devices in hub...
[DeviceHubService] 📤 Sending 2 new device(s) to hub (0 already exist and are active)
[DeviceHubService] ✅ Successfully sent 2 new device(s) to hub: R52RB08X6QJ, R52W509PMWH
{"timestamp":"2026-04-22T19:44:40.350Z","level":"info","service":"node","message":"🔄 Starting DeviceReconciliationService (interval: 60000ms)","args":[]}
{"timestamp":"2026-04-22T19:44:40.356Z","level":"info","service":"node","message":"✅ Device reconciliation service started (interval: 60000ms)","args":[]}
dbug ADB Getting connected devices
🔌 Connecting to hub Socket.IO: http://wchmdhsn07025.qvcdev.qvc.net:3000
🚀 Node server is running on http://localhost:3003
📚 API endpoints available at http://localhost:3003/api
Available endpoints:
GET /health
✅ Socket.IO connected to hub (node: bb97cf8f...)
💓 Socket.IO heartbeat established with hub (node: bb97cf8f...)
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
{"timestamp":"2026-04-22T19:45:40.030Z","level":"info","service":"node","message":"Received createSession event from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionData":{"capabilities":{"alwaysMatch":{"df:deviceId":"9fd0a9f0-46cf-5874-8e36-cbcc6ff841ca","df:sessionType":"manual","appium:settings":{"mjpegServerScreenshotQuality":0,"mjpegServerFramerate":10,"mjpegScalingFactor":100,"animationCoolOffTimeout":0},"platformName":"android","appium:automationName":"uiautomator2","appium:newCommandTimeout":"0"}},"tempSessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","deviceUdid":"R52RB08X6QJ","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","method":"POST","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}}
{"timestamp":"2026-04-22T19:45:40.043Z","level":"info","service":"node","message":"Processing device capabilities...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}
{"timestamp":"2026-04-22T19:45:40.047Z","level":"info","service":"node","message":"Looking up device information for UDID","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceUdid":"R52RB08X6QJ"}
dbug ADB Getting connected devices
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
{"timestamp":"2026-04-22T19:45:40.160Z","level":"info","service":"node","message":"Android Device details for R52RB08X6QJ already available","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","args":[]}
{"timestamp":"2026-04-22T19:45:40.163Z","level":"info","service":"node","message":"Android Device details for R52W509PMWH already available","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","args":[]}
{"timestamp":"2026-04-22T19:45:40.168Z","level":"info","service":"node","message":"Found 2 android devices","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","args":[]}
{"timestamp":"2026-04-22T19:45:40.171Z","level":"info","service":"node","message":"Found device","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceName":"GalaxyTabS7_wchwlqvch00726","platform":"android","version":"12"}
{"timestamp":"2026-04-22T19:45:40.175Z","level":"info","service":"node","message":"Processing Android capabilities","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","caps":{"alwaysMatch":{"df:deviceId":"9fd0a9f0-46cf-5874-8e36-cbcc6ff841ca","df:sessionType":"manual","appium:settings":{"mjpegServerScreenshotQuality":0,"mjpegServerFramerate":10,"mjpegScalingFactor":100,"animationCoolOffTimeout":0},"platformName":"android","appium:automationName":"uiautomator2","appium:newCommandTimeout":"0"},"firstMatch":[{}]}}
{"timestamp":"2026-04-22T19:45:40.215Z","level":"info","service":"node","message":"Processed capabilities with device-specific information","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","note":"using random free ports","allocatedPorts":[8902,8903]}
{"timestamp":"2026-04-22T19:45:40.216Z","level":"info","service":"node","message":"Resolving app resources...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}
{"timestamp":"2026-04-22T19:45:40.244Z","level":"info","service":"node","message":"WDA handling check","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceUdid":"R52RB08X6QJ","devicePlatform":"android","runsOn":"undefined","isIosReal":false,"wdaId":"undefined"}
{"timestamp":"2026-04-22T19:45:40.245Z","level":"info","service":"node","message":"No wdaId in capabilities; checking device-specific WDA mapping","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceUdid":"R52RB08X6QJ"}
{"timestamp":"2026-04-22T19:45:40.265Z","level":"info","service":"node","message":"Requesting device-specific WDA from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","udid":"R52RB08X6QJ","url":"http://wchmdhsn07025.qvcdev.qvc.net:3000/api/wda/device/udid/R52RB08X6QJ"}
{"timestamp":"2026-04-22T19:45:40.305Z","level":"info","service":"node","message":"No device-specific WDA found; fetching default WDA from hub for device type","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceType":"simulator","isIosReal":false,"deviceUdid":"R52RB08X6QJ"}
{"timestamp":"2026-04-22T19:45:40.315Z","level":"info","service":"node","message":"Requesting default WDA from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","deviceType":"simulator","url":"http://wchmdhsn07025.qvcdev.qvc.net:3000/api/wda/default?deviceType=simulator"}
{"timestamp":"2026-04-22T19:45:40.344Z","level":"warn","service":"node","message":"Failed to fetch default WDA from hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","statusCode":404}
{"timestamp":"2026-04-22T19:45:40.345Z","level":"warn","service":"node","message":"No WDA ID available (explicit or default) for iOS real device; skipping WDA installation","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.350Z","level":"info","service":"node","message":"WDA capabilities not set - platform is not iOS","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","devicePlatform":"android","wdaBundleId":"undefined","wdaLocalPath":"undefined"}
{"timestamp":"2026-04-22T19:45:40.361Z","level":"info","service":"node","message":"Detected manual session, injecting MJPEG server port and quality settings","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","isManualSession":true,"isRecordVideoEnabled":false}
{"timestamp":"2026-04-22T19:45:40.388Z","level":"info","service":"node","message":"Allocated new MJPEG port","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","mjpegPort":10000}
{"timestamp":"2026-04-22T19:45:40.390Z","level":"info","service":"node","message":"Injected MJPEG server port and quality settings","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","mjpegPort":10000,"settings":{"mjpegServerScreenshotQuality":25,"mjpegServerFramerate":10,"mjpegScalingFactor":100}}
{"timestamp":"2026-04-22T19:45:40.391Z","level":"info","service":"node","message":"Starting Appium server...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","requestId":"bb97cf8f-adf5-4891-9379-b93a75f9d7b2-temp-d2ed8fff-3e05-4440-aabf-126ffcc29012-1776887140083-24-lera0j"}
{"timestamp":"2026-04-22T19:45:40.393Z","level":"info","service":"node","message":"Starting dedicated Appium server for session...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.402Z","level":"info","service":"node","message":"📋 Session create request received: temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.405Z","level":"info","service":"node","message":"🚀 Starting Appium server for session...","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.409Z","level":"info","service":"node","message":"📝 Session log file (default): C:\Users\LabMachine\tmp\temp-d2ed8fff-3e05-4440-aabf-126ffcc29012\appium.log","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.426Z","level":"info","service":"node","message":"📝 Using default Appium log level: debug (for maximum log visibility)","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.455Z","level":"info","service":"node","message":"🚀 Starting Appium server as child process","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","command":"appium","args":["--port","9000","--address","127.0.0.1","--use-drivers","uiautomator2","--allow-cors","--relaxed-security","--log","C:\Users\LabMachine\tmp\temp-d2ed8fff-3e05-4440-aabf-126ffcc29012\appium.log","--log-level","debug","--log-timestamp"],"port":9000,"sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.459Z","level":"info","service":"node","message":"👀 Started monitoring Appium process stdio for pattern matching","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.463Z","level":"error","service":"node","message":"❌ Failed to start Appium process","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"spawn appium ENOENT"}
{"timestamp":"2026-04-22T19:45:40.552Z","level":"error","service":"node","message":"❌ Failed to start Appium server for session","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"Failed to spawn Appium: spawn appium ENOENT","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.555Z","level":"error","service":"node","message":"❌ Failed to start Appium server","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"Failed to spawn Appium: spawn appium ENOENT"}
{"timestamp":"2026-04-22T19:45:40.566Z","level":"info","service":"node","message":"Released allocated ports","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","ports":[8902,8903]}
{"timestamp":"2026-04-22T19:45:40.576Z","level":"info","service":"node","message":"Cleaning up session resources","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","reason":"session creation error"}
{"timestamp":"2026-04-22T19:45:40.587Z","level":"info","service":"node","message":"📋 Session delete request received: temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4"}
{"timestamp":"2026-04-22T19:45:40.589Z","level":"info","service":"node","message":"🔍 Searching for session","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","searchId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012","activeSessions":[],"totalSessions":0}
{"timestamp":"2026-04-22T19:45:40.590Z","level":"warn","service":"node","message":"❌ No session found for ID","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","sessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.590Z","level":"warn","service":"node","message":"⏭️ Session temp-d2ed8fff-3e05-4440-aabf-126ffcc29012 not in active sessions (already deleted)","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","activeSessions":[]}
{"timestamp":"2026-04-22T19:45:40.591Z","level":"info","service":"node","message":"Stopped Appium server during cleanup","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","tempSessionId":"temp-d2ed8fff-3e05-4440-aabf-126ffcc29012"}
{"timestamp":"2026-04-22T19:45:40.593Z","level":"error","service":"node","message":"Non-Appium error during session creation","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","error":"Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT","stack":"Error: Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT\n at _0xe40c20 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18480565)\n at processTicksAndRejections (node:internal/process/task_queues:104:5)\n at _0x4204bd (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18699311)\n at _0x45c475 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18808984)\n at C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31357549\n at Socket. (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31355674)"}
{"timestamp":"2026-04-22T19:45:40.595Z","level":"info","service":"node","message":"Forwarding error response back to hub","traceId":"ca1f5bbfc6aba561eab51fcc08f4e649","spanId":"87d8669e923c0cb4","status":400,"data":{"value":{"error":"unknown error","message":"Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT","stacktrace":"Error: Failed to start Appium: Failed to spawn Appium: spawn appium ENOENT\n at _0xe40c20 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18480565)\n at processTicksAndRejections (node:internal/process/task_queues:104:5)\n at _0x4204bd (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18699311)\n at _0x45c475 (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:18808984)\n at C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31357549\n at Socket. (C:\Users\LabMachine\AppData\Roaming\npm\node_modules\farm-runner\dist\src\bundle.js:3:31355674)"}}}
dbug ADB Getting connected devices
dbug ADB Connected devices: [{"udid":"R52RB08X6QJ","state":"device"},{"udid":"R52W509PMWH","state":"device"}]
SIGINT received, shutting down gracefully...
🔌 Socket.IO disconnected (shutdown)
🛑 Socket.IO heartbeat stopped
{"timestamp":"2026-04-22T19:45:48.085Z","level":"info","service":"node","message":"🧹 Cleaning up Appium session manager..."}
{"timestamp":"2026-04-22T19:45:48.087Z","level":"info","service":"node","message":"✅ Cleanup complete"}
{"timestamp":"2026-04-22T19:45:48.090Z","level":"info","service":"node","message":"🛑 DeviceReconciliationService stopped","args":[]}
OpenTelemetry SDK shut down