Skip to content

fix: bound devicectl calls with a timeout + cache the iOS app list#19

Merged
DevSrSouza merged 1 commit into
mainfrom
fix/devicectl-timeout-app-cache
Jun 17, 2026
Merged

fix: bound devicectl calls with a timeout + cache the iOS app list#19
DevSrSouza merged 1 commit into
mainfrom
fix/devicectl-timeout-app-cache

Conversation

@DevSrSouza

Copy link
Copy Markdown
Contributor

Problem

The iOS-device app picker shows "No apps found on this device" even though the apps are installed.

Root cause is a robustness gap, surfaced by devicectl being flaky (CoreDevice stalls):

  • Jaca polls devicectl list devices on the discovery loop and runs devicectl device info apps for the picker — but CommandRunner.run had no timeout.
  • When devicectl wedges, those calls hang forever and pile up zombie processes (observed 5+ stuck list devices at once). That congestion wedges CoreDevice further, so device info apps then times out and the picker comes back empty.

Fix

  1. Timeout in CommandRunner.run — an optional timeout SIGKILLs a child that runs too long, so a hung tool can't block the call or accumulate. Applied to every devicectl site: list devices (discovery poll, 12s), device info apps (25s), lockState poll (8s), and the device-availability checks (12s).
  2. Disk cache for the iOS app list — the last good list is saved per device; a slow/empty/failed query falls back to it, so the picker never blanks to "No apps found" while devicectl flakes.

Notes

🤖 Generated with Claude Code

Jaca polls `devicectl list devices` on the discovery loop and runs `device info
apps` for the app picker, but CommandRunner had no timeout. When CoreDevice
stalls (common with devicectl), those calls hang forever and pile up zombie
processes -- which wedges CoreDevice further, so `device info apps` then times
out and the iOS app picker shows "No apps found on this device".

- CommandRunner.run gains an optional `timeout` that SIGKILLs a wedged child, so
  a hung tool can't block the call or accumulate. Applied to every devicectl
  site: list devices (discovery poll), info apps, lockState poll, and the
  device-availability checks.
- The iOS app list is cached to disk per device; a slow/empty/failed query falls
  back to the last good list so the picker never blanks while devicectl flakes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@DevSrSouza DevSrSouza merged commit 8d01a05 into main Jun 17, 2026
DevSrSouza added a commit that referenced this pull request Jun 17, 2026
Building on the devicectl timeout + cache (#19), make the picker resilient to a
slow/flaky devicectl instead of just bounding it:

- Retry the `device info apps` query once. devicectl's first call after a cold
  start often stalls warming the tunnel, then the retry returns fast — so a
  single transient timeout no longer drops to an empty list.
- Cache-first: show the last good list instantly while a refresh runs, and keep
  it shown if the refresh fails — no blank "No apps found" flash when we have a
  cache.
- Reopening the picker re-fetches whenever the list is empty, and the empty
  state now has a Retry button — so a wedged-then-recovered devicectl is one
  click (or reopen) away from populating.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant