* [build-tools] Count Android web preview input toward the session idle timeout
* [build-tools] Count an expo-device-hub read timeout as unobservable, not as a down device
* [build-tools] Do not fail a successful session when its tool tunnel cannot stop
* Shorten the changeset to one sentence
* Name the options for tool tunnels and test a startup Stop
* [eas-cli] Add simulator:devices command
* [eas-cli] Use offered devices in the simulator:start --device help
* [eas-cli] Show simulator:devices as a table of suggested devices
* [build-tools] Retry the first ngrok tunnel open in device run sessions
* [build-tools] Retry the first ngrok open only after the failed open settles
@ngrok/ngrok runs every forward behind one process-wide lock, so a retry
while a timed-out open is still pending only waits behind it. Keep the rule
that no open starts while another is pending: after a time-out, wait a
bounded time for the open to settle, then retry, or fail at once.
Retry only time-outs and ERR_NGROK_802, and let callers cancel startup
retries with a signal.
* [build-tools] Fail ngrok startup with the abort reason and keep the endpoint free
An abort during the wait for a failed open to settle threw the time-out
error, so callers that compare against the startup signal's reason reported
a failed session instead of a stop. Throw the abort reason. Do not retry
while a late listener from the failed open is still open. Add the startup
abort listener only after the local target listens, so it is always removed.
* [build-tools] Log why the first ngrok open is not retried
Say whether the failed open is still pending or its late listener did not
close. Test that an abort while the local target starts prevents the open.
* [build-tools] Keep a late first ngrok open and retry only rejected opens
The first open now waits 19 s instead of retrying a timed-out open. ngrok runs one
open at a time, so a retry after a time-out could only start after the stuck open
settled, and it closed a listener that had arrived late. Only a rejected open with
an exact retryable ngrok error code (ERR_NGROK_802) is retried.
The preview tunnel in the session host now stops retrying when the host finishes.
An open in progress continues, so preview retirement still waits for it.
* [build-tools] Test a non-retryable first-open failure after 15 seconds
* [build-tools] Give ngrok open retries the reopen time-out and log late opens
Retries use the 15 s reopen time-out, so all three attempts fit in the 60 s
preview opening bound. A timed-out or cancelled open logs its outcome and
elapsed time when it settles, so the first-open time-out can be tuned.
* [build-tools] Document why ngrok open retries use a new agent session
* [build-tools] Run worker SSH sessions as detached upterm sessions
* [build-tools] Redact the upterm session id by its JSON field and known value
* [build-tools] Remove the known session id redaction
* [build-tools] Remove the URL userinfo redaction fallback
* [build-tools] Test that a failed upterm start stops the session
* [build-tools] Keep using an upterm found on PATH for SSH sessions
* [build-tools] Report the SSH reconnecting state from the supervisor
* [build-tools] Count SSH guests with upterm's guestCount
* [eas-cli] Point gated simulator accounts at paid plans instead of the waitlist
* [eas-cli] Tell annual Enterprise accounts to contact their account executive
The server does not include annual Enterprise prices at simulator GA. The CLI cannot see the plan, so the gated message covers this case too.
* [eas-cli] Upload local Simulator app bundles
* [eas-cli] Reject unsupported Simulator install archives before upload
* [eas-cli] Keep upload folder guidance specific to the action
* [eas-cli] Clean interrupted app archives and serialize packaging
Start progress before packaging, require archive support for local archives, and keep unknown capability metadata from rejecting the action catalog. Add child-process interruption and packaging coverage.
Co-authored-by: Codex <[email protected]>
---------
Co-authored-by: Codex <[email protected]>
* [build-tools] Fix formatBytes for sizes of 102.4 GB and larger
The last branch divided by 1024 instead of by the GB multiplier, so
200 GB was formatted as "209715200 GB". Add table tests for the helper.
Co-Authored-By: Claude Fable 5.2 <[email protected]>
* [eas-build-job][build-tools][eas-cli] Share one formatBytes helper
build-tools and eas-cli each had the same formatBytes copy. Move it to
@expo/eas-build-job, migrate all callers, and delete both copies.
eas-cli now also gets the fix for sizes of 102.4 GB and larger.
Co-Authored-By: Claude Fable 5.2 <[email protected]>
* [build-tools] Import formatBytes from eas-build-job in androidEmulatorLogs
Co-Authored-By: Claude Fable 5.2 <[email protected]>
* Merge the two formatBytes changesets
Co-Authored-By: Claude Fable 5.2 <[email protected]>
---------
Co-authored-by: Claude Fable 5.2 <[email protected]>
* [eas-cli] Add --android-log-source to eas simulator
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [eas-cli] Drop the retention period from the --android-log-source help
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [eas-cli] Shorten the --android-log-source changeset
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [eas-cli] Rename --android-log-source to --log-source
The flag is unprefixed like the step input it feeds. Passing it without
--platform android fails at runtime.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
---------
Co-authored-by: Claude Fable 5.1 <[email protected]>
* [build-tools] Strip the repository access token from the git remote before the sandbox agent starts
* [build-tools] improve the comment explaining why the repository token is stripped before the sandbox starts
* [build-tools] Record and upload selected Android emulator logs
Select Android log sources at session startup, attach the bounded capture
to every emulator launch, and upload the finalized logs as simulator
session artifacts with truncation metadata.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [build-tools] Upload one Android log artifact per source
Pass the source selection through the capture instead of a second
parameter, let the capture create the launch files, and name artifacts
after the source ring. Finalize the other-workflow capture in the
collection test so no handle closes at garbage collection.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [build-tools] Shorten the Android log changeset
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [build-tools] Choose the Android log writer by session
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [build-tools] Rename android_log_sources to log_sources
The input is unprefixed like every other step input. A non-empty list on an
iOS session fails at runtime, the way network_capture does on Android. The
agent-device step drops its default so an omitted input stays distinguishable
from an explicit selection; the fallback is resolved in code.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [build-tools] Format the retained log size with formatBytes
Co-Authored-By: Claude Fable 5.1 <[email protected]>
---------
Co-authored-by: Claude Fable 5.1 <[email protected]>
* [build-tools] Add bounded Android emulator log capture
Capture emulator output and logcat into fixed-size ring files that keep
the last 20 MiB per source across launches, with logcat delivered through
a named pipe. No caller yet; the emulator wiring follows.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [build-tools] Keep one ring file per Android log source
Sessions write every launch of a source into one ring, `<source>.log`,
with a marker line per launch that produced output. This replaces the
per-launch rings and their cross-file eviction, and bounds disk use at the
budget. Ordinary builds keep plain per-launch files closed per launch. The
capture now owns the source selection.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
* [build-tools] Split the plain Android log writer from the ring
`AndroidEmulatorLogCapture` is now the interface both writers implement.
`AndroidEmulatorLogRing` serves sessions and has no mode checks;
`AndroidEmulatorLogFiles` serves ordinary builds with one appended file
per launch. Document what the logcat output's `closed` promise is for.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
---------
Co-authored-by: Claude Fable 5.1 <[email protected]>
Move the stat, size-zero skip and per-attempt stream reopening into one
helper, and use it for serve-sim app logs.
Co-authored-by: Claude Fable 5.1 <[email protected]>
`eas workflow:run <file>` uploads the local project, so the run carries
no branch or commit and the EAS dashboard cannot list it under a branch.
The two flags record the branch and commit the uploaded
project comes from. They must be given together and cannot be combined
with `--ref`. The server verifies the commit in the project's linked
GitHub repository and reads the commit message from GitHub.
Generated GraphQL types come from production plus the pending www
schema change, so the diff also carries unrelated schema drift.