Coalesce OSC-9 progress reports to cut tab-bar lag during agent activity master
Agents (e.g. Claude Code) emit OSC-9 progress reports far faster than the UI needs. The bridge previously cancelled and re-created a 15s reset Task and wrote observable state on every report, churning the main thread while the agent streamed output; the determinate bar then relaid out a GeometryReader frame width and restarted a 0.2s easeInOut per distinct percent. The visible symptom is a laggy / stuttering progress indicator and elevated CPU while an agent is busy. - GhosttySurfaceBridge: route OSC-9 through `ingestProgressReport`, coalescing behind two single-purpose tasks — a leading-edge-then-trailing flush at the throttle cadence (50ms) and a slow stale-watch (1s wakeups, 15s timeout) that clears a bar whose reports stopped without a REMOVE. Identical reports dedupe at ingest, REMOVE wins over an unapplied trailing value, and the flush task guards cancellation before clearing its handle. The clock and intervals are injected for testing. - SET_TITLE and TerminalTabManager.updateTitle/updateDirty skip no-op writes a TUI re-emits constantly, so an unchanged value no longer invalidates the tab. - GhosttySurfaceProgressBar: bucket determinate percent to 5% steps and render the fill with a leading-anchored scaleEffect instead of a GeometryReader frame width, dropping the per-percent animation so a step composites rather than relaying out. Ported from upstream supacode #347, adapted to the fork's bridge, tab manager, and surface-level progress bar (the fork has no tab-stripe / shimmer views).