Upstream sync to c7f68a7f4 (2026-11-03) + cmux release line

Merged
LA
1d ago
+11285-2374

Brings main up to the latest upstream Ghostty and merges the release line that cmux-next pins, so cmux-next can move to one commit that has both.

Why: cmux-next NIGHTLY froze. The main thread waited in ghostty_surface_free -> pthread_join on a renderer stuck in CVDisplayLinkStop (manaflow-ai/cmux#35300). Upstream's fix ffaaf5d7a came in with v1.4.0 (#64), but cmux-next still pins 7d43bb68b on release/cmux-9ce9b7d0-e2, which forked before v1.4.0.

  1. b7b943fe3: merge release/cmux-9ce9b7d0-e2 (7d43bb68b, PRs #66, #69, #70, #71) into main. Clean. The pinned commit becomes an ancestor of main.
  2. b630aad15: merge upstream main c7f68a7f4 (241 commits after v1.4.0). Zig stays 0.17.0. next/UPSTREAM_BASE moves to c7f68a7f4.

The 4 conflicts and their resolution are in NEXT.md, "Upstream sync to c7f68a7f4": test.yml stays deleted; ghostty.h keeps ghostty_surface_process_output and takes upstream's GHOSTTY_NULLABLE; Screen.clearRows keeps the fork's wrap-edge break and upstream's blank-row fast path; stream_handler.zig keeps the fork's reply tests and adds upstream's tmux test.

Not run locally (Zig 0.17 is not on the laptop, and builds do not run there): this PR's next-xcframework.yml builds, tests and smokes it.


Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Syncs main to upstream Ghostty c7f68a7f4 (241 commits past v1.4.0) and merges the cmux-9ce9b7d0-e2 release line, so cmux-next can pin a single commit containing both. The upstream fix for the cmux NEXT freeze (renderer stuck in CVDisplayLinkStop) landed in v1.4.0, but the pinned cmux commit forked before it.

The PR also carries the fork's wrap-edge fix series driven by cmux VT fuzz findings (stale soft-wrap flags across scrolls, region scrolls, clears, and line breaks), upstream's tmux protocol support (%window-close, %session-window-changed, %output handling, active_window action), new embedded APIs that let the embedder present frames for a host size (ghostty_surface_set_host_present, ghostty_surface_host_frame), and upstream's fix for the snap and flatpak builds, which had been broken since the Zig 0.17 bump.

Merge and conflicts

  • Merges release/cmux-9ce9b7d0-e2 into main cleanly, then upstream c7f68a7f4, making cmux's pinned commit an ancestor of main.
  • Resolves 4 conflicts (details in NEXT.md): test.yml stays deleted; ghostty.h keeps the fork's ghostty_surface_process_output and takes upstream's nullability annotations; Screen.clearRows keeps the fork's wrap-edge break and upstream's blank-row fast path; stream_handler.zig keeps the fork's reply tests and adds upstream's tmux test.
  • Zig stays 0.17.0; version bumps to 1.4.1-dev, pinning the zigimg mirror in build.zig.zon; all example projects now require Zig 0.17.
  • The snap moves to core26 and bundles GStreamer plugins so the audio bell plays.
  • GhosttyNextKit xcframework releases now also publish from release/* branches, so an embedder can take a fix on an old base without unrelated main changes.