From 25c4263f0c54aae4ec8762f009fe8343e012c11e Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Sat, 2 May 2026 21:07:18 -0400 Subject: [PATCH] slab/menubar: complete-state + Terminal theming + restore/restart/tile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Menu Bar app: - ClaudeSession adds a `complete` state ("turn done, idle") between working and stale; icon/dot/menu colors shift to green=working / slate=complete / amber=awaiting / gray=stale. - Restore-threads submenu opens N fresh Terminal windows running `claude -r ` for the most-recently-modified sessions on disk that aren't already live (recovery hatch for when Terminal.app dies). - Restart-all-active SIGTERMs every live session and respawns each in a fresh Terminal with --resume (warns first since it interrupts in-flight work). - Auto-tile + Tile-now pack open Terminal windows into a square-ish grid with font size scaled to fit; "Near"/"Far" text-size radio shrinks the font for close-to-screen viewing. - Theme-by-status pushes per-state background color + custom-title to each Terminal tab via a single batched osascript pass (memoized so it only fires when state/subject actually changes). - New ClaudeHistoryReader.swift reads ~/.claude history JSONLs to source the "restore last N" picks. Bash hooks + install: - claude-prompt-log.sh derives a 4–8-word `summary` from the prompt and writes it both into active-prompts/.json and as an OSC 0 title to the controlling TTY (so the Terminal title reflects the current task even when theme-by-status is off). - claude-stop.sh prefers the new sinebells `all-done-waltz.mp3` when present, falling back to the legacy chime. - install.sh copies any *.mp3 in slab/sounds/ alongside the .wav set so the waltz phrase is installed. Co-Authored-By: Claude Opus 4.7 (1M context) --- slab/bin/claude-prompt-log.sh | 25 +- slab/bin/claude-stop.sh | 9 +- slab/install.sh | 5 + .../Sources/SlabMenubar/AppDelegate.swift | 362 ++++++++++++++++++ .../SlabMenubar/ClaudeHistoryReader.swift | 133 +++++++ .../Sources/SlabMenubar/ClaudeSession.swift | 90 ++++- .../Sources/SlabMenubar/IconRenderer.swift | 15 +- .../Sources/SlabMenubar/MenuBuilder.swift | 71 +++- .../Sources/SlabMenubar/Paths.swift | 12 + .../Sources/SlabMenubar/StateSnapshot.swift | 6 + slab/sounds/all-done-waltz.mp3 | Bin 0 -> 83757 bytes 11 files changed, 710 insertions(+), 18 deletions(-) create mode 100644 slab/menubar-swift/Sources/SlabMenubar/ClaudeHistoryReader.swift create mode 100644 slab/sounds/all-done-waltz.mp3 diff --git a/slab/bin/claude-prompt-log.sh b/slab/bin/claude-prompt-log.sh index c31e420b3a..bfd5e4db45 100755 --- a/slab/bin/claude-prompt-log.sh +++ b/slab/bin/claude-prompt-log.sh @@ -39,14 +39,37 @@ if [[ -n "$input" ]]; then tty=$(ps -o tty= -p $$ 2>/dev/null | tr -d ' ') ts=$(date -u +%Y-%m-%dT%H:%M:%SZ) + # 4–8 word summary used as the live Terminal title and the menubar's + # short subject. We collapse whitespace, take the first 7 words, and + # cap at 48 chars so it fits in a window-title bar. + summary=$(echo "$input" | jq -r '.prompt // ""' \ + | tr '\n\r\t' ' ' \ + | awk '{ + gsub(/^ +| +$/, ""); + n = (NF > 7) ? 7 : NF; + out = ""; + for (i = 1; i <= n; i++) out = (i == 1 ? $i : out " " $i); + if (length(out) > 48) out = substr(out, 1, 45) "…"; + print out; + }') + echo "$input" | jq -c \ --arg sid "$session_id" \ --arg tty "$tty" \ --arg pid "$claude_pid" \ --arg ts "$ts" \ - '{session_id: $sid, cwd: .cwd, subject: (.prompt | tostring | .[0:140]), tty: $tty, claude_pid: ($pid | tonumber? // 0), updated: $ts, state: "working"}' \ + --arg sum "$summary" \ + '{session_id: $sid, cwd: .cwd, subject: (.prompt | tostring | .[0:140]), summary: $sum, tty: $tty, claude_pid: ($pid | tonumber? // 0), updated: $ts, state: "working"}' \ > "$ACTIVE_DIR/$session_id" 2>/dev/null + # Live terminal title: write OSC 0 ("set window + icon name") direct + # to the controlling TTY. Terminal.app picks it up unless the + # menubar's "Theme by status" has set a custom title — that wins, + # and reads the same `summary` field from active-prompts. + if [[ -n "$tty" && -e "/dev/$tty" && -n "$summary" ]]; then + printf '\033]0;%s\007' "$summary" > "/dev/$tty" 2>/dev/null + fi + # User responded — clear any awaiting marker for this session. rm -f "$AWAITING_DIR/$session_id" fi diff --git a/slab/bin/claude-stop.sh b/slab/bin/claude-stop.sh index 1e1883e6ac..9c226cd281 100755 --- a/slab/bin/claude-stop.sh +++ b/slab/bin/claude-stop.sh @@ -117,7 +117,14 @@ elif (( others == 0 )); then tired_stinger "$SLAB_BIN/claude-sleep" now else - /usr/bin/afplay "$CH/all-done.wav" 2>/dev/null & + # Lid open + everything settled → sinebells waltz phrase. Falls back + # to the legacy chime if the rendered file is missing (e.g. fresh + # checkout that hasn't run waltz.mjs yet). + if [[ -f "$CH/all-done-waltz.mp3" ]]; then + /usr/bin/afplay "$CH/all-done-waltz.mp3" 2>/dev/null & + else + /usr/bin/afplay "$CH/all-done.wav" 2>/dev/null & + fi fi else max=8 diff --git a/slab/install.sh b/slab/install.sh index 5bfa200b89..f3a4d6a12a 100755 --- a/slab/install.sh +++ b/slab/install.sh @@ -74,6 +74,11 @@ swiftc -O -o "$SLAB_BIN/lid-ambient-synth" "$SLAB_REPO/bin/lid-ambient-synth.swi # ------------ sounds ------------ say "copying sounds to $SLAB_HOME/sounds" cp -f "$SLAB_REPO/sounds/"*.wav "$SLAB_HOME/sounds/" +# Pre-rendered waltz phrases (e.g. all-done-waltz.mp3 from recap/bin/waltz.mjs). +shopt -s nullglob +mp3s=("$SLAB_REPO/sounds/"*.mp3) +(( ${#mp3s[@]} > 0 )) && cp -f "${mp3s[@]}" "$SLAB_HOME/sounds/" +shopt -u nullglob # ------------ python venv (numpy + sounddevice for reactive listener) ------------ if [[ ! -x "$SLAB_HOME/venv/bin/python3" ]]; then diff --git a/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift b/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift index 8687c709b9..889ace58cf 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift @@ -4,6 +4,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate { private var statusItem: NSStatusItem! private var refreshTimer: Timer? private var animTimer: Timer? + /// `sessionId → "|"` of the last theme/title we pushed + /// to Terminal, so the per-tick refresh only fires osascript when + /// something actually changed. + private var lastTerminalDecor: [String: String] = [:] private var rainbowPhase: CGFloat = 0 private var rotationPhase: CGFloat = 0 private var mailTickCount = 0 @@ -50,6 +54,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate { } statusItem.menu = MenuBuilder.build(state: state, mailStatus: mailStatus, target: self) + + applyTerminalDecor() } private func updateIcon() { @@ -216,6 +222,362 @@ final class AppDelegate: NSObject, NSApplicationDelegate { ShellRunner.runAsync("/usr/bin/osascript", args: ["-e", script]) } + /// Open N fresh Terminal windows, each resuming one of the most-recently- + /// modified Claude sessions on disk that isn't already live. Built for + /// the "Terminal.app crashed and took every Claude with it" case. + @objc func restoreRecentThreads(_ sender: NSMenuItem) { + guard let n = sender.representedObject as? Int, n > 0 else { return } + let liveIds = Set(state.claudeSessions.map { $0.sessionId }) + let tile = state.autoTile + let near = state.nearText + // Snapshot screen geometry on main; NSScreen reads off-main can + // return nil on first hit and were the silent failure mode for the + // first auto-tile pass. + let geom = tile ? Self.screenGeom() : nil + DispatchQueue.global(qos: .userInitiated).async { [weak self] in + let entries = ClaudeHistoryReader.recent(limit: n, excluding: liveIds) + if entries.isEmpty { + DispatchQueue.main.async { + self?.notify(title: "slab", subtitle: "Restore threads", body: "No restorable Claude sessions found.") + } + return + } + let layout = geom.flatMap { Self.computeTileLayout(count: entries.count, geom: $0, near: near) } + for (i, entry) in entries.enumerated() { + let cell = layout?.cellAt(index: i) + Self.openTerminalRunningClaude( + cwd: entry.cwd, + sessionId: entry.sessionId, + bounds: cell?.bounds, + fontSize: layout?.fontSize + ) + } + } + } + + /// Stop every live Claude session, then relaunch each in a fresh Terminal + /// window with `--resume`. Confirms first because it kills in-flight work. + @objc func restartAllActive() { + let sessions = state.claudeSessions + if sessions.isEmpty { return } + let alert = NSAlert() + alert.messageText = "Restart all active Claude sessions?" + alert.informativeText = "This will stop \(sessions.count) running session\(sessions.count == 1 ? "" : "s") and relaunch each in a fresh Terminal window. In-flight work will be interrupted." + alert.alertStyle = .warning + alert.addButton(withTitle: "Restart All") + alert.addButton(withTitle: "Cancel") + NSApp.activate(ignoringOtherApps: true) + guard alert.runModal() == .alertFirstButtonReturn else { return } + + // Snapshot what we need before SIGTERM races the active-prompts + // janitor — once the pid dies, the marker file gets reaped. + let payloads = sessions.map { (sid: $0.sessionId, cwd: $0.cwd, pid: $0.claudePid) } + let geom = state.autoTile ? Self.screenGeom() : nil + let layout = geom.flatMap { Self.computeTileLayout(count: payloads.count, geom: $0, near: state.nearText) } + DispatchQueue.global(qos: .userInitiated).async { + for p in payloads where p.pid > 0 { + kill(pid_t(p.pid), SIGTERM) + } + // Brief grace period so the old TTY/process tree tears down + // before the resumed session tries to grab the keyring etc. + Thread.sleep(forTimeInterval: 0.5) + for (i, p) in payloads.enumerated() where !p.cwd.isEmpty { + let cell = layout?.cellAt(index: i) + Self.openTerminalRunningClaude( + cwd: p.cwd, + sessionId: p.sid, + bounds: cell?.bounds, + fontSize: layout?.fontSize + ) + } + } + } + + @objc func toggleAutoTile() { + let path = Paths.autoTileFlag + let fm = FileManager.default + if fm.fileExists(atPath: path) { + try? fm.removeItem(atPath: path) + } else { + let dir = (path as NSString).deletingLastPathComponent + try? fm.createDirectory(atPath: dir, withIntermediateDirectories: true) + fm.createFile(atPath: path, contents: nil) + } + refresh() + } + + @objc func setTextNear() { + let path = Paths.nearTextFlag + let dir = (path as NSString).deletingLastPathComponent + try? FileManager.default.createDirectory(atPath: dir, withIntermediateDirectories: true) + FileManager.default.createFile(atPath: path, contents: nil) + refresh() + tileNow() + } + + @objc func setTextFar() { + try? FileManager.default.removeItem(atPath: Paths.nearTextFlag) + refresh() + tileNow() + } + + @objc func toggleThemeByStatus() { + let path = Paths.themeByStatusFlag + let fm = FileManager.default + if fm.fileExists(atPath: path) { + try? fm.removeItem(atPath: path) + // Forget what we pushed so re-enabling later starts from a + // clean slate (no "we already themed this session" memory + // surviving across an off→on cycle). + lastTerminalDecor.removeAll() + } else { + let dir = (path as NSString).deletingLastPathComponent + try? fm.createDirectory(atPath: dir, withIntermediateDirectories: true) + fm.createFile(atPath: path, contents: nil) + } + refresh() + applyTerminalDecor() + } + + /// Push the per-status Terminal profile + custom title to each window + /// matching a live Claude session. Called from `refresh()`, but only + /// emits an osascript when something actually changed since the last + /// pass (state flipped, subject moved, or new session appeared). + private func applyTerminalDecor() { + guard state.themeByStatus else { return } + // {R, G, B} in AppleScript color space (each component 0–65535). + // Picked to read at a glance on dark monospace text without + // requiring a profile swap. We avoid `set current settings` because + // applying a profile resets the tab's font + the window's pixel + // size to the profile default, causing a brief reframe-flicker + // even when we save/restore around it. + struct Assignment { let tty: String; let bg: (Int, Int, Int)?; let title: String } + var changes: [Assignment] = [] + var seen = Set() + for s in state.claudeSessions where !s.tty.isEmpty { + seen.insert(s.sessionId) + let bg: (Int, Int, Int)? + let glyph: String + switch s.state { + // Working = green (active/healthy), complete = calm slate + // (turn done, idle), awaiting = amber (needs you to continue), + // stale = no bg change. RGBs are 0–65535 AppleScript colorspace, + // dark enough that the profile's default light text still reads. + case .working: bg = (1500, 14000, 4000); glyph = "● working" // deep forest green + case .complete: bg = (5000, 7000, 12000); glyph = "✓ complete" // muted slate + case .awaiting: bg = (32000, 18000, 1500); glyph = "◉ awaiting" // warm amber — attention! + case .stale: bg = nil; glyph = "○ stale" // leave bg alone + } + let title = "\(glyph) · \(s.titleString)" + let bgKey = bg.map { "\($0.0),\($0.1),\($0.2)" } ?? "-" + let key = "\(bgKey)|\(title)" + if lastTerminalDecor[s.sessionId] == key { continue } + lastTerminalDecor[s.sessionId] = key + changes.append(Assignment(tty: s.tty, bg: bg, title: title)) + } + // Reap entries for sessions that disappeared since last tick — they + // either died or got reaped by the janitor; either way our memo is + // stale. + for sid in lastTerminalDecor.keys where !seen.contains(sid) { + lastTerminalDecor.removeValue(forKey: sid) + } + if changes.isEmpty { return } + + // One osascript pass that walks every window×tab once and applies + // every change in this batch. We only touch `background color` and + // `custom title` — neither resets font or window size, so there's + // nothing to save/restore and nothing to flicker. + var lines = [ + "tell application \"Terminal\"", + " repeat with w in windows", + " repeat with t in tabs of w", + " try", + " set ttyName to tty of t", + ] + for a in changes { + let escTty = a.tty.replacingOccurrences(of: "\"", with: "\\\"") + let escTitle = a.title + .replacingOccurrences(of: "\\", with: "\\\\") + .replacingOccurrences(of: "\"", with: "\\\"") + lines.append(" if ttyName ends with \"\(escTty)\" then") + if let bg = a.bg { + lines.append(" set background color of t to {\(bg.0), \(bg.1), \(bg.2)}") + } + lines.append(" set custom title of t to \"\(escTitle)\"") + lines.append(" end if") + } + lines.append(contentsOf: [ + " end try", + " end repeat", + " end repeat", + "end tell", + ]) + let script = lines.joined(separator: "\n") + ShellRunner.runAsync("/usr/bin/osascript", args: ["-e", script]) + } + + /// Spawn a new Terminal.app window that cd's into `cwd` and resumes the + /// given session. Optionally sets bounds + font size so the caller can + /// tile the windows. Single-quoted shell args are escaped so a path with + /// apostrophes can't break out. + private static func openTerminalRunningClaude( + cwd: String, + sessionId: String, + bounds: (left: Int, top: Int, right: Int, bottom: Int)? = nil, + fontSize: Int? = nil + ) { + let safeCwd = cwd.replacingOccurrences(of: "'", with: "'\\''") + let safeSid = sessionId.replacingOccurrences(of: "'", with: "'\\''") + let shellCmd = "cd '\(safeCwd)' && claude -r '\(safeSid)'" + let escapedCmd = shellCmd.replacingOccurrences(of: "\\", with: "\\\\") + .replacingOccurrences(of: "\"", with: "\\\"") + + var lines = ["tell application \"Terminal\"", " activate", " do script \"\(escapedCmd)\""] + // Order matters: setting font size makes Terminal snap the window to + // the nearest whole row/col grid, which can shrink it. So we set + // bounds, then font, then bounds again — the second `set bounds` + // forces the pixel size we actually want, even if Terminal would + // rather round it. + if let b = bounds { + lines.append(" set bounds of front window to {\(b.left), \(b.top), \(b.right), \(b.bottom)}") + } + if let fs = fontSize { + lines.append(" set font size of selected tab of front window to \(fs)") + } + if let b = bounds { + lines.append(" set bounds of front window to {\(b.left), \(b.top), \(b.right), \(b.bottom)}") + } + lines.append("end tell") + let script = lines.joined(separator: "\n") + ShellRunner.runAsync("/usr/bin/osascript", args: ["-e", script]) + } + + // MARK: - Auto tile layout + + /// One cell in the tiled grid, in AppleScript's top-left-origin pixel + /// coordinates (Terminal.app's `bounds` property uses this space). + /// Per-side gutter between tiled windows (and at the edge of the visible + /// frame). Total inter-window gap is 2*gutter; total edge gap = gutter. + static let tileGutter = 2 + + struct TileLayout { + let cols: Int + let rows: Int + let cellWidth: Int + let cellHeight: Int + let originX: Int // visible-frame left edge + let originY: Int // visible-frame top edge (below menu bar), AS coords + let fontSize: Int + + struct Cell { + let bounds: (left: Int, top: Int, right: Int, bottom: Int) + } + + func cellAt(index: Int) -> Cell { + let row = index / cols + let col = index % cols + let left = originX + col * cellWidth + tileGutter + let top = originY + row * cellHeight + tileGutter + let right = originX + (col + 1) * cellWidth - tileGutter + let bottom = originY + (row + 1) * cellHeight - tileGutter + return Cell(bounds: (left, top, right, bottom)) + } + } + + /// Snapshot of the main display's geometry, in AppleScript's top-left- + /// origin pixel coordinates. Captured on the main thread so layout math + /// can run safely off-main. + struct ScreenGeom { + let originX: Int // visible-frame left edge (AS coords) + let originY: Int // visible-frame top edge (below menu bar, AS coords) + let width: Int + let height: Int + } + + static func screenGeom() -> ScreenGeom? { + guard let screen = NSScreen.main else { return nil } + let visible = screen.visibleFrame + let fullHeight = screen.frame.height + let asTopOfVisible = Int(fullHeight - (visible.origin.y + visible.size.height)) + return ScreenGeom( + originX: Int(visible.origin.x), + originY: asTopOfVisible, + width: Int(visible.size.width), + height: Int(visible.size.height) + ) + } + + /// Pack `count` windows into the most-square grid that fits the main + /// display's visible frame. Font size scales down for denser grids so + /// even N=10 stays legible. + private static func computeTileLayout(count: Int, geom: ScreenGeom, near: Bool = false) -> TileLayout? { + guard count > 0 else { return nil } + let cols = max(1, Int(ceil(Double(count).squareRoot()))) + let rows = max(1, Int(ceil(Double(count) / Double(cols)))) + let cellW = geom.width / cols + let cellH = geom.height / rows + // Inner pixels available per window after the gutter is taken out. + let innerW = max(1, cellW - 2 * tileGutter) + let innerH = max(1, cellH - 2 * tileGutter) + + // Pick the largest font that fits ~24 rows × ~80 cols of monospace + // in the inner area. A char cell is roughly fontSize * 0.6 wide and + // fontSize * 1.2 tall in Menlo/SF Mono. Enlarging is fine — for low + // N the cells are huge, so the font scales up rather than us + // wasting empty pixels at a fixed default. + let fontByH = Double(innerH) / (24.0 * 1.2) + let fontByW = Double(innerW) / (80.0 * 0.6) + let raw = min(fontByH, fontByW) + // Near = "I'm sitting close, give me density" → 60% of the + // legible-from-typical-distance size, floored at 6pt. + let scaled = near ? raw * 0.6 : raw + let fontSize = max(near ? 6 : 8, Int(scaled.rounded())) + + return TileLayout( + cols: cols, + rows: rows, + cellWidth: cellW, + cellHeight: cellH, + originX: geom.originX, + originY: geom.originY, + fontSize: fontSize + ) + } + + /// Tile every currently-open Terminal.app window into the same grid the + /// auto-tile path uses. Independent of the auto-tile flag — this is the + /// "I forgot to enable it" / "I want to re-pack what's open" button. + @objc func tileNow() { + guard let geom = Self.screenGeom() else { return } + let near = state.nearText + DispatchQueue.global(qos: .userInitiated).async { + // Ask Terminal for its window count first so we can size the + // grid to what's actually on screen. + let countOut = ShellRunner.run( + "/usr/bin/osascript", + args: ["-e", "tell application \"Terminal\" to count windows"], + timeout: 5 + ).output.trimmingCharacters(in: .whitespacesAndNewlines) + guard let n = Int(countOut), n > 0 else { return } + guard let layout = Self.computeTileLayout(count: n, geom: geom, near: near) else { return } + + var lines: [String] = ["tell application \"Terminal\"", " activate"] + for i in 0../.jsonl` and returns the +/// most-recently-modified sessions. Used by the menubar's "Restore threads" +/// submenu so a Terminal.app crash that wipes every Claude tab can be +/// recovered with one click. +enum ClaudeHistoryReader { + /// Return the `limit` most-recently-modified sessions, excluding any + /// session id present in `excludeSessionIds` (typically the live ones + /// listed in `~/.local/share/slab/state/active-prompts/`). + static func recent(limit: Int, excluding excludeSessionIds: Set = []) -> [ClaudeHistoryEntry] { + let fm = FileManager.default + let projectsDir = "\(Paths.home)/.claude/projects" + guard let projectDirs = try? fm.contentsOfDirectory(atPath: projectsDir) else { + return [] + } + + // Pass 1: collect (path, mtime, sessionId) for every JSONL across all + // project dirs, skipping anything already live. We only need the + // metadata at this stage so directory walks stay cheap. + struct Candidate { + let path: String + let sessionId: String + let mtime: Date + } + var candidates: [Candidate] = [] + for dir in projectDirs where !dir.hasPrefix(".") { + let dirPath = "\(projectsDir)/\(dir)" + guard let files = try? fm.contentsOfDirectory(atPath: dirPath) else { continue } + for file in files where file.hasSuffix(".jsonl") { + let sessionId = String(file.dropLast(".jsonl".count)) + if excludeSessionIds.contains(sessionId) { continue } + let path = "\(dirPath)/\(file)" + let mtime = (try? fm.attributesOfItem(atPath: path)[.modificationDate] as? Date) ?? .distantPast + candidates.append(Candidate(path: path, sessionId: sessionId, mtime: mtime)) + } + } + + // Pass 2: sort by mtime desc, then read the first user message of the + // top `limit` files for subject/cwd. Avoid parsing thousands of files + // when the user only asked for 10. + candidates.sort { $0.mtime > $1.mtime } + var entries: [ClaudeHistoryEntry] = [] + for c in candidates { + if entries.count >= limit { break } + guard let (cwd, subject) = firstUserMessage(path: c.path) else { continue } + // Empty cwd would mean we can't `cd` to relaunch — drop it. + if cwd.isEmpty { continue } + entries.append(ClaudeHistoryEntry( + sessionId: c.sessionId, + cwd: cwd, + mtime: c.mtime, + subject: subject + )) + } + return entries + } + + /// Stream the first `type:"user"` line of a JSONL and return its + /// `(cwd, content)` pair. We read line-by-line to avoid pulling + /// multi-megabyte conversations into memory. + private static func firstUserMessage(path: String) -> (String, String)? { + guard let handle = FileHandle(forReadingAtPath: path) else { return nil } + defer { try? handle.close() } + + var buffer = Data() + var fallbackCwd = "" + // Read in 64KB chunks; almost every session has a user message in the + // first chunk. Cap total read so a pathological file can't hang us. + let chunkSize = 64 * 1024 + let maxRead = 1 * 1024 * 1024 + var totalRead = 0 + + while totalRead < maxRead { + let chunk = handle.readData(ofLength: chunkSize) + if chunk.isEmpty { break } + totalRead += chunk.count + buffer.append(chunk) + + while let nlIdx = buffer.firstIndex(of: 0x0A) { + let lineData = buffer[.. String? { + guard let msg = message as? [String: Any] else { return nil } + if let s = msg["content"] as? String { return s } + if let arr = msg["content"] as? [[String: Any]] { + for block in arr { + if (block["type"] as? String) == "text", let t = block["text"] as? String { + return t + } + } + } + return nil + } +} diff --git a/slab/menubar-swift/Sources/SlabMenubar/ClaudeSession.swift b/slab/menubar-swift/Sources/SlabMenubar/ClaudeSession.swift index 45af8f3aff..aa1ac1445c 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/ClaudeSession.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/ClaudeSession.swift @@ -1,11 +1,21 @@ import Foundation struct ClaudeSession { - enum State { case working, awaiting, stale } + /// `working` — Claude is actively running a turn. + /// `complete` — Stop fired ("turn complete"); session is alive but idle, + /// waiting for the next user prompt. Calm, no attention needed. + /// `awaiting` — Notification fired; Claude paused mid-task and needs the + /// user (permission prompt, idle-on-input). Attention! + /// `stale` — claude_pid is gone; about to be reaped. + enum State { case working, complete, awaiting, stale } let sessionId: String let cwd: String let subject: String + /// 4–8 word topic summary written by `claude-prompt-log.sh` for use as + /// a live Terminal title. Empty for older active-prompts files; callers + /// fall back to `shortSubject`. + let summary: String let tty: String let claudePid: Int let updated: Date @@ -19,6 +29,13 @@ struct ClaudeSession { return trimmed[.. = [] for name in names where !name.hasPrefix(".") { let path = "\(activeDir)/\(name)" - guard let session = parse(path: path, fallbackId: name) else { continue } + guard let session = parse(path: path, fallbackId: name) else { + // Unparseable file with a real name: leave it alone — could + // be an in-flight write from claude-prompt-log.sh. + continue + } var s = session + + if s.claudePid > 0 && !pidAlive(s.claudePid) { + // Dead pid → reap active marker and any matching awaiting + // marker. Best-effort: ignore unlink errors (concurrent + // janitor in claude-stop.sh may have beaten us here). + try? fm.removeItem(atPath: path) + try? fm.removeItem(atPath: "\(awaitingDir)/\(s.sessionId)") + continue + } + if let msg = awaitingMessages[s.sessionId] { - s.state = .awaiting + // claude-stop.sh writes the literal string "turn complete" + // (idle-after-turn). claude-notify.sh writes the actual + // permission/notification message. Distinguish so the user + // sees a calm cue for "done with the turn" vs a louder cue + // for "i need you to continue". + if msg.lowercased().hasPrefix("turn complete") { + s.state = .complete + } else { + s.state = .awaiting + } s.awaitingMessage = msg - } else if pidAlive(s.claudePid) || s.claudePid == 0 { - s.state = .working } else { - s.state = .stale + s.state = .working } sessions.append(s) + liveIds.insert(s.sessionId) } + reapOrphanAwaiting(awaitingDir: awaitingDir, validIds: liveIds) + + // Sort: attention-needed first (awaiting), then complete, then + // working, all most-recent first within each band. return sessions.sorted { a, b in - if a.state == .awaiting && b.state != .awaiting { return true } - if a.state != .awaiting && b.state == .awaiting { return false } + func rank(_ st: ClaudeSession.State) -> Int { + switch st { + case .awaiting: return 0 + case .complete: return 1 + case .working: return 2 + case .stale: return 3 + } + } + let ra = rank(a.state), rb = rank(b.state) + if ra != rb { return ra < rb } return a.updated > b.updated } } + /// Drop awaiting-prompts entries that no longer have a live active + /// counterpart. Mirrors the orphan sweep in claude-stop.sh so the + /// menubar can self-heal without waiting on another session's Stop. + private static func reapOrphanAwaiting(awaitingDir: String, validIds: Set) { + let fm = FileManager.default + guard let names = try? fm.contentsOfDirectory(atPath: awaitingDir) else { return } + for name in names where !name.hasPrefix(".") { + if validIds.contains(name) { continue } + try? fm.removeItem(atPath: "\(awaitingDir)/\(name)") + } + } + private static func parse(path: String, fallbackId: String) -> ClaudeSession? { guard let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else { return nil } @@ -78,6 +150,7 @@ enum ClaudeSessionReader { sessionId: fallbackId, cwd: "", subject: "(no subject)", + summary: "", tty: "", claudePid: 0, updated: mtime, @@ -100,6 +173,7 @@ enum ClaudeSessionReader { sessionId: (obj["session_id"] as? String) ?? fallbackId, cwd: (obj["cwd"] as? String) ?? "", subject: (obj["subject"] as? String) ?? "(no subject)", + summary: (obj["summary"] as? String) ?? "", tty: (obj["tty"] as? String) ?? "", claudePid: (obj["claude_pid"] as? Int) ?? 0, updated: updated, diff --git a/slab/menubar-swift/Sources/SlabMenubar/IconRenderer.swift b/slab/menubar-swift/Sources/SlabMenubar/IconRenderer.swift index ed5fb98add..ce2c4cae9e 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/IconRenderer.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/IconRenderer.swift @@ -180,19 +180,22 @@ enum IconRenderer { path.stroke() } - /// Per-session edge color. Working = steady cyan-teal. Awaiting = - /// pulsing warm red, the loud "look at me" state. Stale = slow gray - /// blink, "thread is dead but the marker's still on disk." + /// Per-session edge color. Working = steady green ("active and healthy"). + /// Complete = soft slate (turn done, idle — quiet). Awaiting = pulsing + /// amber, the loud "look at me, continue" state. Stale = slow gray blink, + /// "thread is dead but the marker's still on disk." private static func sessionColor(_ state: ClaudeSession.State, phase: CGFloat) -> NSColor { switch state { case .working: - return NSColor(deviceHue: 0.50, saturation: 0.60, brightness: 0.82, alpha: 1.0) + return NSColor(deviceHue: 0.33, saturation: 0.70, brightness: 0.78, alpha: 1.0) + case .complete: + return NSColor(deviceHue: 0.58, saturation: 0.30, brightness: 0.70, alpha: 1.0) case .awaiting: // Pulse brightness at 2 Hz so paused threads visibly throb - // among the steady cyan working ones. + // among the steady green working ones. let pulse = 0.5 + 0.5 * cos(phase * .pi * 4) let brightness = 0.70 + 0.30 * pulse - return NSColor(deviceHue: 0.0, saturation: 0.92, brightness: brightness, alpha: 1.0) + return NSColor(deviceHue: 0.10, saturation: 0.95, brightness: brightness, alpha: 1.0) case .stale: let blink = 0.5 + 0.5 * cos(phase * .pi * 2) return NSColor(deviceWhite: 0.28 + 0.32 * blink, alpha: 1.0) diff --git a/slab/menubar-swift/Sources/SlabMenubar/MenuBuilder.swift b/slab/menubar-swift/Sources/SlabMenubar/MenuBuilder.swift index 39e9151f31..566244a4a8 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/MenuBuilder.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/MenuBuilder.swift @@ -98,6 +98,17 @@ enum MenuBuilder { } menu.addItem(info(header)) + menu.addItem(buildRestoreSubmenu(state: state, target: target)) + + if !sessions.isEmpty { + let restartAll = item( + "Restart all active (\(sessions.count))", + selector: #selector(AppDelegate.restartAllActive), + target: target + ) + menu.addItem(restartAll) + } + if sessions.isEmpty { return } for s in sessions { @@ -105,6 +116,7 @@ enum MenuBuilder { switch s.state { case .awaiting: dot = "◉" case .working: dot = "●" + case .complete: dot = "✓" case .stale: dot = "○" } let tail = s.cwdLabel.isEmpty ? "" : " · \(s.cwdLabel)" @@ -122,13 +134,66 @@ enum MenuBuilder { } } + /// "Restore threads" submenu — recovery hatch for the case where + /// Terminal.app dies and takes every Claude tab with it. Each item opens + /// N fresh Terminal windows running `claude -r ` for the + /// most-recently-modified sessions on disk that aren't already live. + private static func buildRestoreSubmenu(state: StateSnapshot, target: AppDelegate) -> NSMenuItem { + let parent = NSMenuItem(title: "Restore threads", action: nil, keyEquivalent: "") + let sub = NSMenu() + + let tile = item("Auto tile windows", selector: #selector(AppDelegate.toggleAutoTile), target: target) + tile.state = state.autoTile ? .on : .off + sub.addItem(tile) + sub.addItem(item("Tile now", selector: #selector(AppDelegate.tileNow), target: target)) + + // Text size — radio pair so the active mode is visible at a glance. + // Near = denser (close to screen), Far = auto-fit "suitable" size. + let textParent = NSMenuItem(title: "Text size", action: nil, keyEquivalent: "") + let textSub = NSMenu() + let farItem = NSMenuItem(title: "Far (suitable)", action: #selector(AppDelegate.setTextFar), keyEquivalent: "") + farItem.target = target + farItem.state = state.nearText ? .off : .on + textSub.addItem(farItem) + let nearItem = NSMenuItem(title: "Near (small)", action: #selector(AppDelegate.setTextNear), keyEquivalent: "") + nearItem.target = target + nearItem.state = state.nearText ? .on : .off + textSub.addItem(nearItem) + textParent.submenu = textSub + sub.addItem(textParent) + + let theme = item("Theme by status", selector: #selector(AppDelegate.toggleThemeByStatus), target: target) + theme.state = state.themeByStatus ? .on : .off + theme.toolTip = "Re-skin Terminal windows by Claude state — Ocean for working, Red Sands for awaiting, custom title shows the subject" + sub.addItem(theme) + + sub.addItem(.separator()) + + for n in 1...10 { + let entry = NSMenuItem( + title: "Restore last \(n)", + action: #selector(AppDelegate.restoreRecentThreads(_:)), + keyEquivalent: "" + ) + entry.target = target + entry.representedObject = n + entry.isEnabled = true + sub.addItem(entry) + } + parent.submenu = sub + return parent + } + private static func coloredTitle(for s: ClaudeSession, dot: String, tail: String) -> NSAttributedString { let full = "\(dot) \(s.shortSubject)\(tail)" let attr = NSMutableAttributedString(string: full) let dotColor: NSColor switch s.state { - case .working: dotColor = NSColor(deviceHue: 0.50, saturation: 0.60, brightness: 0.82, alpha: 1.0) - case .awaiting: dotColor = NSColor(deviceHue: 0.0, saturation: 0.92, brightness: 0.92, alpha: 1.0) + // Working = green (active/healthy), complete = soft slate (calm), + // awaiting = warm amber (needs you), stale = gray. + case .working: dotColor = NSColor(deviceHue: 0.33, saturation: 0.70, brightness: 0.78, alpha: 1.0) + case .complete: dotColor = NSColor(deviceHue: 0.58, saturation: 0.30, brightness: 0.70, alpha: 1.0) + case .awaiting: dotColor = NSColor(deviceHue: 0.10, saturation: 0.95, brightness: 0.95, alpha: 1.0) case .stale: dotColor = NSColor(deviceWhite: 0.55, alpha: 1.0) } // Color the status dot strong, the rest of the line in the dot's @@ -147,6 +212,8 @@ enum MenuBuilder { switch s.state { case .awaiting: parts.append("awaiting: \(s.awaitingMessage ?? "input")") + case .complete: + parts.append("turn complete (idle)") case .working: parts.append("working") case .stale: diff --git a/slab/menubar-swift/Sources/SlabMenubar/Paths.swift b/slab/menubar-swift/Sources/SlabMenubar/Paths.swift index dc5981fb2b..153a1d214f 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/Paths.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/Paths.swift @@ -33,6 +33,18 @@ enum Paths { /// chimes and stops ambient instead of starting it. Toggled from the /// menubar's "Mute ambient sonification" item. static var muteFlag: String { "\(slabHome)/state/muted" } + /// When this file exists, restored / restarted Claude windows are + /// auto-tiled across the main display in a grid sized by the window + /// count, with the Terminal font scaled so no cell is too cramped. + static var autoTileFlag: String { "\(slabHome)/state/auto-tile" } + /// When this file exists, the tile font is shrunk well below the + /// "comfortable from typical distance" size — for sitting close to the + /// screen and wanting more content per pane. + static var nearTextFlag: String { "\(slabHome)/state/tile-near" } + /// When this file exists, each Terminal window matching a live Claude + /// session is re-themed by status (working/awaiting), so a wall of + /// terminals reads as a status display at a glance. + static var themeByStatusFlag: String { "\(slabHome)/state/theme-by-status" } } enum Tools { diff --git a/slab/menubar-swift/Sources/SlabMenubar/StateSnapshot.swift b/slab/menubar-swift/Sources/SlabMenubar/StateSnapshot.swift index 62fa242e3d..583993ee61 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/StateSnapshot.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/StateSnapshot.swift @@ -7,6 +7,9 @@ struct StateSnapshot { var activeSubagents: Int = 0 var ambientActive: Bool = false var muted: Bool = false + var autoTile: Bool = false + var nearText: Bool = false + var themeByStatus: Bool = false var tailnetPeers: [TailnetPeer] = [] var claudeSessions: [ClaudeSession] = [] @@ -34,6 +37,9 @@ struct StateSnapshot { s.activeSubagents = countFiles(in: Paths.activeSubagentsDir) s.ambientActive = FileManager.default.fileExists(atPath: Paths.ambientFlag) s.muted = FileManager.default.fileExists(atPath: Paths.muteFlag) + s.autoTile = FileManager.default.fileExists(atPath: Paths.autoTileFlag) + s.nearText = FileManager.default.fileExists(atPath: Paths.nearTextFlag) + s.themeByStatus = FileManager.default.fileExists(atPath: Paths.themeByStatusFlag) s.tailnetPeers = TailnetPeer.query() s.claudeSessions = ClaudeSessionReader.active() return s diff --git a/slab/sounds/all-done-waltz.mp3 b/slab/sounds/all-done-waltz.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d6290d418f462debbbcad104b3f34c0f882071d6 GIT binary patch literal 83757 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

%c7go$r{U-tQ}45> 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≪GC3J4?@+fDR79b+(-aGH4uS>E? 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 literal 0 HcmV?d00001 -- 2.51.2