(sessionID: SessionID, duration: Duration.Input = "2 seconds")
| 326 | // inside Runner.startShell's serialized transition, so cancel can't no-op once |
| 327 | // we observe it. |
| 328 | const waitForBusy = (sessionID: SessionID, duration: Duration.Input = "2 seconds") => |
| 329 | pollWithTimeout( |
| 330 | Effect.gen(function* () { |
| 331 | const status = yield* SessionStatus.Service |
| 332 | const s = yield* status.get(sessionID) |
| 333 | return s.type === "busy" ? (true as const) : undefined |
| 334 | }), |
| 335 | `session ${sessionID} never became busy`, |
| 336 | duration, |
| 337 | ) |
| 338 | |
| 339 | const hasBash = Effect.sync(() => Bun.which("bash") !== null) |
| 340 |
no test coverage detected