Skip to content

Phase 3.5 — native integrations: UNUserNotificationCenter + session jump actions + Lisa.app menu bar #29

Description

@oratis

Now that PR #24, #26, #28 are all on main, the missing piece is connecting the moving parts via macOS-native surfaces.

Three independent additions

A — Native notifications in LisaIsland.app

Replace the web `Notification` API path with macOS `UNUserNotificationCenter`. Better permission flow, plays nicer with Focus / Do Not Disturb, can carry the LISA mascot as the notification icon.

  • New `Notifier.swift` in `packaging/island-mac/Sources/LisaIsland/`
  • Permission request on first `notify` postMessage from the page
  • `IslandContent.swift` handles new message type `{type: "notify", title, body, sessionId}`
  • `src/web/island.ts`: prefer native bridge over `new Notification(...)` when `window.webkit.messageHandlers.island` is present
  • Notification click → bridges back to `open_full_gui`

B — Session row jump actions

Each Claude session row in the expand panel currently shows status + project + time. Phase 3.5 adds two actions in an inline expanded view:

  • 📁 Open in Finder — opens the session's cwd in Finder
  • 📋 Copy resume command — `cd "" && claude --resume ` to clipboard, ready to paste in any terminal

Needs the watcher to surface `cwd`, which is a top-level field in Claude Code's JSONL (already-public-shape metadata, not message content). Privacy contract unchanged.

C — Lisa.app menu bar mirror

Lisa.app gains a menu bar status item that mirrors the Claude active count:

  • `▷ 3` when 3 sessions active
  • `▶︎ 1` when 1+ waiting (needs you)
  • `✕` when error
  • `○` when none

Click → bring Lisa.app to front. Tooltip shows per-state breakdown.

Polls `/api/claude/sessions` every 10s (no SSE in Swift yet — keeps it simple).

Strategy

All three are independent in code (different files / directories / surfaces) but conceptually one "Phase 3.5 native polish" milestone. Ship as a single PR with three logical commits so review can step through each piece if desired.

Out of scope

  • iTerm2 / Warp URL scheme jump to a specific terminal pane (needs per-app integration; later)
  • Per-session SSE subscription in Swift (current polling is sufficient)
  • macOS Focus / Do Not Disturb opt-in UI (system handles)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions