| 260 | } |
| 261 | |
| 262 | async function waitForService(name, url, timeoutMs = 30000) { |
| 263 | const start = Date.now(); |
| 264 | |
| 265 | while (Date.now() - start < timeoutMs) { |
| 266 | try { |
| 267 | const res = await fetch(url); |
| 268 | if (res.ok) { |
| 269 | logService(name, `Ready at ${url}`, c.green); |
| 270 | return true; |
| 271 | } |
| 272 | } catch { |
| 273 | // Keep trying |
| 274 | } |
| 275 | await delay(500); |
| 276 | } |
| 277 | |
| 278 | logService(name, `Timeout waiting for ${url}`, c.red); |
| 279 | return false; |
| 280 | } |
| 281 | |
| 282 | // ═══════════════════════════════════════════════════════════════════════════ |
| 283 | // Service Starters (agent-server + automation are byte-for-byte the same as |