Commit Graph

140 Commits

Author SHA1 Message Date
Jinwoo Hong c256a5a417
Windows terminal update-survival (single consolidated PR) (#7538) 2026-07-07 19:21:07 -04:00
Neil f311307560
Add max-lines ratchet CI gate to block new line-limit bypasses (#7608)
oxlint already fails any file over max-lines that is not suppressed, so the
only way to grow past the budget is to add an eslint/oxlint-disable max-lines
comment or a per-file max-lines bump in mobile/.oxlintrc.json. This adds a CI
gate that freezes the current set of suppressions (config/max-lines-baseline.txt,
355 grandfathered entries) and fails the build when a NEW one appears — with a
loud, actionable message pointing at 'split the file'. Existing oversized files
are untouched; the baseline may only shrink (pnpm check:max-lines-ratchet --prune).

Wired into the root lint script and as a dedicated pr.yml step. Unit-tested
(15 cases) and verified against all three failure paths + clean-tree pass.

Co-authored-by: Orca <help@stably.ai>
2026-07-06 17:12:27 -07:00
Jinwoo Hong 6a4b89785c
revert: back out the Windows terminal update-survival chain (#7421→#7499) (#7505)
* Revert "Preload the daemon windowsHide shim via --require; wrap promisify custom (#7499)"

This reverts commit 8f396badaf.

* Revert "Hide console windows for children of the node.exe-hosted daemon (#7486)"

This reverts commit f0fdd3a716.

* Revert "fix(daemon): relocate daemon host image out of the install-dir kill zone (#7473)"

This reverts commit f4faafa987.

* Revert "fix(pty): keep runtime dirs a surviving daemon still uses (#7463)"

This reverts commit 3cd23a13a1.

* Revert "Relocate node-pty ConPTY runtime outside the Windows install dir (fixes update-time terminal loss) (#7421)"

This reverts commit 509c41e2bf.
2026-07-05 22:50:48 -07:00
Brennan Benson f4faafa987
fix(daemon): relocate daemon host image out of the install-dir kill zone (#7473)
Co-authored-by: Neil <neil@stably.ai>
Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-07-05 19:52:06 -07:00
Neil b3f86813b3
fix(ci): register PSGallery via PSResourceGet for Windows SignPath install (#7379)
Register-PSRepository -Default failed inside the legacy nuget.exe provider
with "Missing option value for: '-source'" on the hosted windows-2022 image,
leaving PSGallery unregistered so the subsequent Set-PSRepository threw
"No repository with the name 'PSGallery'".

Prefer Microsoft.PowerShell.PSResourceGet (bundled with PowerShell 7.4+),
which has PSGallery registered by default and avoids that code path; fall
back to PowerShellGet with an explicit NuGet-provider bootstrap only when
PSResourceGet is unavailable.

Co-authored-by: Orca <help@stably.ai>
2026-07-04 16:57:09 -07:00
Brennan Benson 5b5ce6cef8
Harden reliability gate policy and register merged terminal regression tests as gates (#7295)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <delta-eng@stably.ai>
2026-07-03 19:58:07 -07:00
Jinwoo Hong 25896f2cdb
fix(mobile): keep Android release versionCode committed (#7271)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 15:26:11 -07:00
Neil 96481b1eab
Stop scheduled release cuts (#7258) 2026-07-03 11:03:28 -07:00
Brennan Benson c06507ee30
Open terminal file links on mobile (#7134)
Co-authored-by: Orca <help@stably.ai>
2026-07-02 18:17:47 -07:00
Brennan Benson 49a8e80526
Temporarily bypass Windows inner signature gate (#7137)
Co-authored-by: Neil <neil@stably.ai>
2026-07-02 12:34:35 -07:00
Brennan Benson fc17c57b6b
Fix Windows SignPath PSGallery preflight (#7135)
* Verify Windows app executable signing

* Isolate Windows signing verifier tests

* Handle direct Windows installer extraction

* Fix SignPath PowerShell gallery preflight

---------

Co-authored-by: Neil <neil@stably.ai>
2026-07-02 11:42:44 -07:00
Brennan Benson 85cec26773
Prevent unsigned Windows app releases (#6806)
* Verify Windows app executable signing

* Isolate Windows signing verifier tests

* Handle direct Windows installer extraction

---------

Co-authored-by: Neil <neil@stably.ai>
2026-07-02 10:54:19 -07:00
Brennan Benson 22db5b78d6
Fix Windows bundled ConPTY packaging (#6968)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 18:05:38 -07:00
Neil 7cfae28115
ci: isolate Blacksmith mac release build (#6962) 2026-06-30 16:36:59 -07:00
Brennan Benson 9408cadb80
ci: keep release workflow GitHub-hosted for SignPath (#6946)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 14:58:43 -07:00
Brennan Benson 16de859fdf
ci: isolate mac release build from SignPath matrix (#6937)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 13:55:48 -07:00
Brennan Benson 22e9c4f4bb
ci: pin Windows release runner to VS 2022 (#6932)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 13:21:32 -07:00
Neil 677fc4319e
ci: run signed macOS release build on Blacksmith (6 vCPU) — ~2x faster (#6882)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 02:32:27 -07:00
Brennan Benson 584cec78c3
fix(mobile): fail fast when iOS App Store train is closed (#6633)
Co-authored-by: Orca <help@stably.ai>
2026-06-29 14:08:23 -07:00
Neil 2739310839
fix(terminal): converge post-spawn PTY size reconcile to fix split-mount column desync (#6725)
* fix(terminal): converge post-spawn PTY size reconcile to fix split-mount column desync

Follow-up to #6644/#6649. Those added a post-spawn PTY reconcile but capped
it at a FIXED 12 requestAnimationFrames whose counter advanced even on frames
where the pane was unmeasurable or the split layout had not yet equalized. When
a tab MOUNTS with a split layout already present (a new worktree opened with the
side split panel on), the real narrow split width settles AFTER frame 12, so the
reconcile gave up while xterm had reflowed narrow and the PTY stayed pinned at
the wide spawn width. The corrective xterm onResize is dropped during the hidden
mount window (isRendererPtyResizeAuthoritative() is false), so process.stdout.columns
stayed wide and interactive TUIs (Claude Code) rendered garbled until a manual resize.

Extract the reconcile into pty-size-reconcile.ts with an authoritative-gated
convergence loop instead of a fixed frame budget:
- While the pane is hidden (onResize dropped), the reconcile is the SOLE corrector:
  it keeps polling and forwarding every grid change (its transport.resize bypasses
  the visibility gate). Hidden frames never advance the settle counter.
- Once visible AND stable for SETTLE_FRAMES, it hands off to the live
  onResize/ResizeObserver path, which reliably catches any later reflow.
- Hard cap (MAX_FRAMES) guarantees termination; mobile-fit/locked frames are
  skipped; the reconcile handle is cancelled on dispose.

Harness: pty-size-reconcile.test.ts (14 tests) drives the loop with a deterministic
frame scheduler; the desync-repro tests fail against the old 12-frame logic and
pass on the fix. Adds an e2e "MOUNTS with a split layout present" test.

Caveat: headless Electron does not reproduce this layout-settle-after-rAF race
(the existing golden e2e passes even against the old buggy logic), which is why
#6644/#6649 merged with green e2e yet the bug persisted. The unit test is the
real regression harness; the e2e tests are integration smoke.

Made with [Orca](https://github.com/stablyai/orca)

Co-authored-by: Orca <help@stably.ai>

* fix(terminal): re-assert PTY size on visibility resume to heal stubborn column desync

Follow-up within the same fix: the user reported "sometimes even resizing
doesn't fix it." Root cause beyond the mount-timing race — the renderer forwards
resizes fire-and-forget and dedupes on the size it THINKS it sent, but never
learns the PTY's actual size. A resize dropped main-side (the pane was hidden,
a mobile take-back resize-suppression window, or a provider no-op) leaves xterm
and the PTY silently diverged; a later same-cols layout fires no onResize, so it
never self-corrects.

Expose the PTY's last-APPLIED size to the renderer and re-assert on show:
- New read-only IPC pty:getSize -> ptySizes.get(id) (the size written only when
  a resize actually lands or at spawn — the authoritative "what the PTY believes
  it is"). Wired through preload (window.api.pty.getSize) + api-types.
- On visibility resume (noteVisibilityResume), the pane re-fits, reads the PTY's
  real size, and re-asserts via forwardPtyResize ONLY on genuine drift — so no
  spurious SIGWINCH on an already-synced resume (which would jar alt-screen TUIs).
  Routed through forwardPtyResize so the authoritative/mobile gates are
  re-checked at send time; remote-runtime PTYs (separate viewport channel) are
  skipped; overlapping resumes coalesce to one query.

Also register pty:getSize in the registerPtyHandlers removeHandler cleanup block
so re-registration (macOS re-activate / new window) doesn't throw on a duplicate
ipcMain.handle, and make the pty IPC test mock throw on duplicate channels like
real Electron so this class of omission is caught going forward.

Tests: 7 resume-reassert cases (drift / match / null / remote-skip /
mobile-fit-skip / hide-during-hop / overlap-coalesce), all non-vacuous. Full
terminal-pane + pty IPC suites green (1494 tests); typecheck (web+node) + oxlint
clean; e2e desync specs pass against a fresh build.

Made with [Orca](https://github.com/stablyai/orca)

Co-authored-by: Orca <help@stably.ai>

* Stub PTY getSize API and skip redundant Wayland GPU sandbox tests

- Implement PTY `getSize` stub in `web-preload-api.ts` to satisfy API
  requirements for the web-preload environment.
- Skip the unfixed Wayland GPU sandbox negative control test if the
  target base branch already contains the sandbox workaround.

---------

Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-06-29 12:12:35 -07:00
Neil 0976f9427c
fix(linux): disable GPU sandbox to stop terminal input freeze on Wayland (#5319) 2026-06-28 19:43:18 -07:00
Brennan Benson 5c3ba7be91
Improve inactive workspace cleanup UX (#3600)
Co-authored-by: Orca <help@stably.ai>
2026-06-28 11:38:23 -07:00
Brennan Benson d9d870d93f
Stabilize sharded e2e CI concurrency (#6312)
Co-authored-by: Neil <neil@stably.ai>
2026-06-24 18:39:02 -07:00
Brennan Benson c6299f8b85
Improve Windows release signing reliability (#6292)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 14:24:42 -07:00
Neil d992062cf9
fix: publish linux release matrix artifacts (#6111) 2026-06-22 18:28:01 -07:00
Jinwoo Hong 7b8adaf5f9
Improve Android mobile release dispatch (#6087)
Co-authored-by: Orca <help@stably.ai>
2026-06-22 10:51:31 -07:00
Neil 531bcc9a0e
build: publish linux arm64 release artifacts (#4755) 2026-06-22 01:07:16 -07:00
Jinwoo Hong 674e1ccee9
Provide TestFlight changelog for external sharing (#6006)
Co-authored-by: Orca <help@stably.ai>
2026-06-21 16:12:08 -07:00
Jinwoo Hong f6b82829f4
Improve iOS mobile release versioning (#5994)
Co-authored-by: Orca <help@stably.ai>
2026-06-21 12:25:25 -07:00
Jinjing 240b5e0a1f
ci: disable Windows rendering release evidence (#5898) 2026-06-20 13:25:54 -07:00
Jinjing c36a14032f
Temporarily disable Windows golden E2E CI (#5897) 2026-06-20 02:11:18 -07:00
Jinjing d053620be3
Use stable PR head SHA for golden E2E checkout
Checkout the stable pull request head SHA in the golden E2E experiment workflow so reruns after merge do not fail on missing pull_request merge refs.
2026-06-20 01:44:20 -07:00
OrcaWin 4ea550bbef
fix(release): sign Windows installers with SignPath
Co-authored-by: Neil <neil@stably.ai>
2026-06-19 14:06:21 -07:00
Jinwoo Hong 3bd7b36012
Narrow computer-use e2e trigger (#5685)
Co-authored-by: Orca <help@stably.ai>
2026-06-17 23:27:26 -07:00
Brennan Benson ce273c8aef
Improve release validation reliability (#5643)
Co-authored-by: Orca <help@stably.ai>
2026-06-17 20:05:55 -07:00
Brennan Benson 9885ff9760
Add crash report diagnostic log upload (#2580)
Co-authored-by: Orca <help@stably.ai>
2026-06-16 18:05:15 -07:00
Jinjing b516108bde Use generated README downloads badge 2026-06-16 11:09:40 -07:00
Jinwoo Hong 3da4760038
Build iOS on macos-26 / Xcode 26.5 for Expo SDK 55
expo-modules-core@55 needs Swift 6 / Xcode 26.x; Xcode 16.4 can't parse @MainActor. Bump runner to macos-26, Xcode 26.5. Admin-merge: only repo-wide pr.yml break failing.
2026-06-15 23:28:28 -07:00
Jinwoo Hong b5e6390ad2
Split mobile release into separate iOS and Android workflows (#5475)
Splits the combined Mobile Release workflow into mobile-ios-release.yml (mobile-ios-v* tags) and mobile-android-release.yml (mobile-android-v* tags) so iOS App Store review no longer gates Android. Also fixes iOS signing by passing the App Store Connect API key to build_app so xcodebuild can provision via -allowProvisioningUpdates.

Merged with --admin: the only failing check is the repo-wide pr.yml '@/lib/utils' vitest break affecting all PRs, unrelated to this change.
2026-06-15 23:01:44 -07:00
Jinwoo Hong 6740c00351
Build and ship iOS to TestFlight from CI (#5468)
Adds an ios-build job to the Mobile Release workflow (build + sign + TestFlight upload on a macOS runner via fastlane + App Store Connect API key), and fixes a pre-existing Mobile Checks bug where the mobile typecheck needed root deps for ../src imports.

Merged with --admin: the only failing check is the repo-wide pr.yml '@/lib/utils' vitest resolution break affecting all open PRs, unrelated to this change.
2026-06-15 21:38:00 -07:00
Neil 4660a25f09
Gate releases on terminal rendering golden 2026-06-08 20:49:17 -07:00
Jinwoo-H 8b453d014b ci: gate release-cut to the canonical repo so it skips forks (#4815)
Co-authored-by: Orca <help@stably.ai>
2026-06-08 16:57:55 -07:00
Neil 1856d6b585
Add terminal rendering golden e2e gate (#4878) 2026-06-08 11:21:50 -07:00
Jinwoo Hong 76cb846d68
Harden computer use runtime and CLI (#4705)
Co-authored-by: Orca <help@stably.ai>
2026-06-07 17:49:01 -07:00
Neil 13c31fdce1
Expose terminal perf workflow profile knobs (#4826) 2026-06-07 12:48:46 -07:00
Neil 008d336e26
Schedule terminal scale perf report gate (#4823) 2026-06-07 11:50:26 -07:00
pullfrog[bot] 6379db5ecc
Add `pullfrog.yml` workflow 2026-06-05 21:38:46 +00:00
Brennan Benson 63ec0d2c1b
Add golden core flow E2E tests (#4615)
Co-authored-by: Orca <help@stably.ai>
2026-06-04 13:17:26 -07:00
Neil 5185ff3bf2
Use semver max for latest stable release (#4622)
Select the latest stable desktop release by numeric semver instead of trusting release list order.
2026-06-03 23:42:33 -07:00
Neil c60744ec22
Harden release tag recovery
Recover unpublished current-ref stable tags and use package.json as the stable version floor when GitHub Releases regresses after a deleted release.
2026-06-03 18:38:03 -07:00