Commit Graph
893 Commits
Author SHA1 Message Date
github-actions[bot] 41edc493b8 release: v1.4.131-rc.1 2026-07-09 19:37:51 +00:00
github-actions[bot] ff661a7ab2 release: v1.4.131-rc.0 2026-07-09 18:39:27 +00:00
github-actions[bot] 31378023ff release: v1.4.130 2026-07-09 10:51:24 +00:00
github-actions[bot] 148478e488 release: v1.4.130-rc.0 2026-07-09 10:12:37 +00:00
github-actions[bot] 5ba408b506 release: v1.4.129-rc.7 2026-07-09 05:38:32 +00:00
NeilandOrca 25ea2bbfd1 onboarding: seamless macOS notification permission step with live state detection (#7684)
* feat(onboarding): state-aware macOS notification permission step

The Set up notifications step showed a one-size-fits-all 'Open Mac
Settings' button that simultaneously fired the macOS permission prompt
and opened System Settings — two competing system UIs, with System
Settings unnecessary for the common fresh-install case.

Electron exposes no API to read macOS notification authorization, but
scheduling outcomes do reveal it: a silent probe notification's 'show'
event means permission is granted, 'failed' means delivery is blocked.
A new notifications:probeDelivery IPC runs that probe (cached via
passive delivery evidence and a persisted confirmation flag), and the
onboarding card now renders the real state:

- fresh install: the probe itself pops the native Allow dialog the
  moment the step opens; the card flips to 'Notifications are enabled'
  automatically when the user clicks Allow (silent 2.5s re-probes)
- blocked: amber card with an Open System Settings deep-link, which
  also self-heals once the user flips the toggle
- granted: green confirmation card

The test-notification button now feeds the same card instead of the
ambiguous 'if no banner appeared…' toast during onboarding.

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

* fix: don't log expected probe rejections while polling for permission

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

* fix: amber warning styling + single stable dev bundle id for notifications

- Blocked card now uses the app's shipped amber idiom (tinted surface with
  amber title/body) instead of white-on-amber-wash, which read muddy in
  dark mode; macOS permission card split into its own module to stay under
  the max-lines budget.
- Dev instances previously minted a unique macOS bundle id per
  branch x Electron version, registering a new Notification Settings entry
  every time ('Orca: <branch>' rows piling up forever) and pointing the
  settings deep-link at ids System Settings can't resolve. All dev
  instances now share com.stablyai.orca.dev: one Notification Center
  entry, one permission grant covering every dev build.

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

* fix: tighten macOS permission card copy

Body copy was one long sentence; now a single short instruction with
'Updates automatically.' as a separate dimmer line. Also repairs locale
catalog parity for keys introduced by commits rebased into this branch.

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

* fix: drop 'Updates automatically.' line; ad-hoc sign dev app copies

The extra line read as confusing filler — the cards now carry one short
instruction each.

Dev Electron copies had broken code signatures (the Info.plist identity
edits invalidate the ad-hoc seal), which macOS punishes by refusing
Notification Center registration outright: every dev notification failed
with UNErrorDomain error 1, the app never appeared in System Settings >
Notifications, and the settings deep-link had nothing to land on. The dev
runner now ad-hoc re-signs the copied bundle after the plist edits
(bundleLayoutVersion bumped so stale unsigned copies are recreated).
Verified end-to-end: runner-built copy passes codesign --verify --deep,
probe delivery returns delivered, the onboarding card flips green in dev,
and the deep link opens the dev app's own notifications pane.

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

* fix: drop confusing copy line; session-only permission evidence

Removes the 'Updates automatically.' line from both permission cards.

Also drops the persisted notificationDeliveryConfirmed flag: OS-level
permission changes between sessions, and a stale positive rendered a
false green card. Delivery evidence is now session-scoped only.

Documented detection ceiling (verified empirically on macOS 26): while
the permission dialog is unanswered — and when notifications are toggled
off in System Settings after being authorized — macOS accepts requests
and silently swallows them, with no public API (Notification Center
delivered-history and legacy ncprefs both included) able to distinguish
that from real delivery. 'failed' remains definitive for unsigned builds
and dialog-level denials.

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

* feat: real macOS notification permission readout via native helper

Electron has no API for UNUserNotificationCenter authorization, and every
observable fallback lies: scheduling succeeds (and getHistory lists the
notification) even while macOS silently swallows display because the
permission dialog is unanswered or notifications were toggled off in
System Settings. The onboarding card therefore showed 'enabled' after the
user disabled notifications.

Adds native/notification-status-macos: a tiny Swift binary that prints
the app's real authorization status. It runs from inside the app bundle
(NSBundle resolves the bundle by walking up from the executable) and
embeds the app's CFBundleIdentifier in a __TEXT,__info_plist section so
every codesign --force pass — electron-builder's signing or the dev
runner's ad-hoc deep sign — derives the identifier macOS keys
notification records to. Spawning it from the app returns authorized /
denied / not-determined exactly matching System Settings.

notifications:probeDelivery now prefers this readout (authoritative,
silent), firing at most one dialog-trigger probe per session while the
decision is pending, and falls back to the previous delivery-probe
heuristics when the helper is unavailable. The card polls the readout
silently in every state, so toggling Allow notifications in System
Settings flips the card within a poll — both directions, verified live.
Test notifications also consult the readout so 'delivered' is no longer
claimed for swallowed notifications.

Packaged builds ship the helper via extraResources and sign it in
afterPack like the computer-use helper; dev copies compile it on demand
(swiftc, non-fatal when missing) with the shared dev bundle id.

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

* feat: in-app fallback for swallowed notifications + permission card in Settings

- Dispatch now consults the authorization readout before creating a
  native notification: when macOS would silently swallow it (denied or
  prompt unanswered) it returns reason 'blocked-by-system' instead of
  piling invisible notifications into Notification Center. The terminal
  notification path surfaces that as a once-per-session in-app toast
  with an Open System Settings action. Mobile fan-out is unaffected.
- Settings > Notifications now shows the same live permission card as
  onboarding (moved to components/notifications/), polling the readout
  so System Settings changes reflect within seconds, and the test
  button updates it inline.
- Test sends that are blocked at the OS level now show the
  settings-pointing failure toast instead of a generic error.

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

* fix: hide macOS permission card while Orca notifications are disabled

A green 'Notifications are enabled' card next to a disabled Enable
Notifications toggle read as a contradiction — the card now renders (and
the readout polls) only while Orca's own notifications setting is on.
Also single-flights the authorization helper so simultaneous agent
completions share one readout process.

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-08 22:21:40 -07:00
github-actions[bot] dd0a42cf9c release: v1.4.129-rc.6 2026-07-09 05:19:58 +00:00
github-actions[bot] 582fe5948e release: v1.4.129-rc.3 2026-07-09 00:08:33 +00:00
github-actions[bot] 19f1ad4c3d release: v1.4.129-rc.2 2026-07-08 22:38:00 +00:00
github-actions[bot] 745765bb96 release: v1.4.129-rc.1 2026-07-08 09:34:47 +00:00
github-actions[bot] 5c3c2f2b3d release: v1.4.129-rc.0 2026-07-08 00:55:27 +00:00
Jinwoo Hong c256a5a417 Windows terminal update-survival (single consolidated PR) (#7538) 2026-07-07 19:21:07 -04:00
github-actions[bot] 1b66de0426 release: v1.4.127-rc.5 2026-07-07 22:14:27 +00:00
github-actions[bot] eed0058168 release: v1.4.127-rc.0 2026-07-07 05:04:32 +00:00
NeilandOrca 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
github-actions[bot] ee2e3a30a5 release: v1.4.126 2026-07-06 22:59:57 +00:00
github-actions[bot] 014fd3cf26 release: v1.4.126-rc.0 2026-07-06 22:14:09 +00:00
Jinwoo HongandOrca 417723411e perf(source-control): stop gh rate-limit storms and idle git-status spawn churn (#7595)
Co-authored-by: Orca <help@stably.ai>
2026-07-06 15:12:56 -07:00
github-actions[bot] 28495f6036 release: v1.4.125 2026-07-06 20:25:41 +00:00
github-actions[bot] d8ed41f74c release: v1.4.125-rc.2 2026-07-06 18:27:45 +00:00
github-actions[bot] 883b56be6e release: v1.4.125-rc.1 2026-07-06 17:50:35 +00:00
github-actions[bot] 057db5b287 release: v1.4.125-rc.0 2026-07-06 17:14:30 +00:00
github-actions[bot] f2393c9555 release: v1.4.124 2026-07-06 08:22:48 +00:00
Jinwoo Hong 3b081c11e0 Revert "feat(daemon): Phase 0 update-survival groundwork — daemon file log + packaged-update proof harness (#7532)" (#7535)
This reverts commit e9b9836da5.
2026-07-06 01:12:37 -07:00
Jinwoo Hong e9b9836da5 feat(daemon): Phase 0 update-survival groundwork — daemon file log + packaged-update proof harness (#7532)
Two independent pieces, no behavior change to terminal handling:

1. Daemon lifecycle file log. The detached daemon runs with stdio
ignored, so field failures have zero daemon-side evidence. The daemon
now writes rotated NDJSON lifecycle events (startup/ready/hello
accept+reject/session create/attach/exit/kill/shutdown/uncaught
exceptions) to logs/daemon.log via a new optional --log-file fork arg.
Fail-open (any fs error disables logging), adoption-neutral (old
daemons without the arg keep working, protocol untouched), and the
diagnostic bundle collector now includes the file, bounded by the same
lookback window as trace spans.

2. tools/win-update-e2e: a packaged NSIS update proof harness. Installs
version N, drives the installed app (isolated userData), plants a
canary marker session, silently updates to N+1, relaunches, and
asserts an explicit expectations profile: --expect cold-restore
(today's behavior) or --expect survival (the Phase 1 target). Window
flashes are detected by baseline-diffed window enumeration with
canary-title attribution; daemons are identified by command-line
marker, never exe name. Refuses to run when a pre-existing Orca app is
running or (without --allow-existing-install) installed, and only
uninstalls an install it fully owns.
2026-07-06 01:09:54 -07:00
github-actions[bot] ecff85401d release: v1.4.124-rc.9 2026-07-06 06:14:25 +00:00
github-actions[bot] dacb84bbb5 release: v1.4.124-rc.8 2026-07-06 05:51:34 +00:00
github-actions[bot] 638a8f71f3 release: v1.4.124-rc.7 2026-07-06 05:14:01 +00:00
github-actions[bot] 61bd98db6f release: v1.4.124-rc.5 2026-07-06 02:52:58 +00:00
github-actions[bot] 0fa8589abf release: v1.4.124-rc.4 2026-07-06 00:25:02 +00:00
github-actions[bot] f3f67a51f5 release: v1.4.124-rc.3 2026-07-05 23:34:53 +00:00
github-actions[bot] eee2d9807d release: v1.4.124-rc.2 2026-07-05 22:39:26 +00:00
github-actions[bot] dbf1da0f44 release: v1.4.124-rc.1 2026-07-05 19:51:20 +00:00
github-actions[bot] 4b2e4735d7 release: v1.4.124-rc.0 2026-07-05 19:29:31 +00:00
github-actions[bot] 17d5eff5d6 release: v1.4.123-rc.1 2026-07-05 06:02:14 +00:00
github-actions[bot] 85adb2ddad release: v1.4.123-rc.0 2026-07-05 00:22:51 +00:00
github-actions[bot] ad329e2f26 release: v1.4.122-rc.4 2026-07-04 22:41:11 +00:00
github-actions[bot] 8070e65778 release: v1.4.122-rc.3 2026-07-04 07:27:11 +00:00
github-actions[bot] 7595baccef release: v1.4.122-rc.2 2026-07-04 06:21:22 +00:00
github-actions[bot] 19bb7df93a release: v1.4.122-rc.1 2026-07-04 05:49:42 +00:00
Brennan BensonandOrca 1282f5c2da Add reliability gate manifest (#7001)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 19:26:00 -07:00
github-actions[bot] 266defab34 release: v1.4.122-rc.0 2026-07-04 02:25:39 +00:00
github-actions[bot] 41e395b66b release: v1.4.121-rc.6 2026-07-04 00:24:44 +00:00
github-actions[bot] 0bc417e04d release: v1.4.121-rc.5 2026-07-03 23:41:58 +00:00
github-actions[bot] f3e103ebe7 release: v1.4.121-rc.3 2026-07-03 21:28:43 +00:00
github-actions[bot] a4f9dda71a release: v1.4.121-rc.1 [rc-slot:2026-07-03-03] 2026-07-03 10:57:58 +00:00
github-actions[bot] 0ab4d8925c release: v1.4.120 2026-07-03 07:06:43 +00:00
github-actions[bot] 8e1ce20289 release: v1.4.120-rc.6 2026-07-03 06:44:20 +00:00
github-actions[bot] bf6a39987c release: v1.4.120-rc.5 2026-07-03 05:50:01 +00:00
github-actions[bot] f7ec1c727e release: v1.4.120-rc.4 2026-07-03 04:28:04 +00:00