Keep-alive for any app:
- On TXM devices (iOS 26+), keep-alive now falls back to the bundled universal
JIT script for apps with no assigned/name-matched script. Previously only known
apps got a script callback, so a generic app's JIT brk syscalls went unserviced
and the app hung / was killed in the background — the reason keep-alive "didn't
work for any app". The fallback is read straight from the app bundle so the
current, cancellation-aware script is always used.
- Stopping a hold now reliably stops the script loop: the hold and its JIT script
share one cancellation token, exposed to JS as should_continue() and honored by
send_command(). universal.js checks should_continue() each iteration. On stop we
interrupt + detach so the held app keeps running instead of being torn down. The
cancellation flag is only read from the script's own thread, so there is no
unsafe concurrent access to the (non-thread-safe) debug proxy.
Banner from the "Other" tab:
- Selecting an app in the "Other" (launch) tab while keep-alive is enabled now
holds it in the background and shows the banner, instead of silently launching
without a debugger. The launch rows show a green "Hold" action and a footer note
in this mode.
Dynamic Island / Live Activity:
- New StikDebugWidgets widget-extension target hosting a keep-alive Live Activity,
with compact/expanded/minimal Dynamic Island presentations and a Lock Screen
view. Shared KeepAliveActivityAttributes lives in a StikDebugShared group used by
both the app and the extension.
- BackgroundAliveManager starts the activity when a hold begins and ends it when
the hold stops; stale activities from a previous run are cleared at launch.
- Added NSSupportsLiveActivities to the app Info.plist.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EpCxAimrBo9RA8v6BxSEXT