Skip to content

2.0.9: UI/UX overhaul, /pause, settings & fact-checked docs#12

Merged
katipally merged 35 commits into
mainfrom
ui-ux-overhaul
Jun 23, 2026
Merged

2.0.9: UI/UX overhaul, /pause, settings & fact-checked docs#12
katipally merged 35 commits into
mainfrom
ui-ux-overhaul

Conversation

@katipally

Copy link
Copy Markdown
Owner

What

The 2.0.9 release: the UI/UX overhaul branch, plus a full fact-check pass over every doc.

Features

  • /pause (Shift+Esc; aliases /nudge, /add): soft-interrupt a running agent and fold in missed context via a composer. Replaces the old /add steering. The fictional /pause! / "next step" flow is gone.
  • /settings (Ctrl+G, alias /config), /theme, /update modals; rebindable keybindings (~/.friday/keybindings.json).
  • Inline slash menu replaces the command palette; dead SelectList/CommandPalette removed.

Docs — fact-checked against source

Every doc verified against actual code. Fixes include:

  • pause.md rewritten (was entirely fiction: /pause!, "+ next step" button, inline-text handling — none exist).
  • Tool names corrected (apply_patch, multi_edit, ask_user, board_claim_file, board_release_file).
  • Auth precedence (auth.json wins, not env), sessions.db path, dashboard tabs (no "History"), fleet backends.
  • Stale source strings fixed too (dashboard description, fleet toast).

Verification

Local CI green: 187 tests pass, typecheck clean, biome clean, version-drift guard OK.

🤖 Generated with Claude Code

katipally and others added 30 commits June 21, 2026 14:38
…ty commands

- prompt.ts: per-provider system-prompt overlays (openai/azure terser+apply_patch,
  google explicit-steps) and outputStyle overlay (concise|explanatory|minimal)
- format.ts: best-effort auto-format of touched files after edit (biome/prettier/
  ruff/gofmt/rustfmt), local-bin resolution, config.formatter=false to disable
- config: add outputStyle + formatter keys; thread through engine.selection()
- TUI: add /init, /context, /usage, /stats, /doctor, /review, /security-review

ponytail: statusline skipped (TUI already has a status strip + cost meter);
/review is a prompt stub here, upgraded to orchestrated multi-agent in phase 1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…, attach

Make friday a real multi-agent orchestrator on top of the existing concurrent
background-runner engine.

- tools: spawn_agents (fan out N parallel agents in one call) + send_to_task
  (inject/queue a follow-up into a running agent); both deferred, bash-gated
- engine: spawnAgents(), sendToTask() with an idle-drain queue, openFleet()
- fleet.ts: open a viewer window per running agent — tmux panes when inside
  tmux, else macOS Terminal / common Linux emulators, else fall back to the
  in-TUI Tasks panel. Each window runs `friday attach`.
- cli: `friday attach <id>` — read-only transcript tail from the shared store
  (no IPC/server); polls for newly-persisted messages
- TUI: /fleet command opens windows for running agents

ponytail: programmatic-tool-calling JS executor descoped — the spawn/send/
status tools already give the model real programmatic orchestration; a sandboxed
code-driver is a large risky surface to add only if tool-level coordination
proves insufficient. attach is poll-tail (1s, turn-granular), not token-stream.

Verified: typecheck clean · 151/151 tests · attach renders a seeded session ·
tool wiring self-check passes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…wser (CDP)

No bundled Chromium — launch the user's Chrome/Brave/Edge with
--remote-debugging-port on a dedicated friday profile and talk raw CDP over a
WebSocket (Bun's built-in fetch + WebSocket, zero new deps).

- browser.ts: minimal CDP client + BrowserSession (module singleton) and 8
  deferred tools: browser_navigate/snapshot/click/type/eval/screenshot/console/
  close. Snapshot-first (interactive elements as numbered text refs) so it works
  without a vision model.
- shared: new "browser" + "computer" permission categories — ask by default,
  deny in plan, allow in yolo; runner hides them from plan-mode tool list
- engine: startBrowser/closeBrowser/browserAvailable (/chrome command)
- config.browser (binary/port/userDataDir override); /doctor reports availability

The "computer" category is added here too (Phase 4 reuses it).

Verified: typecheck clean · 151/151 tests · live CDP round-trip against real
Chrome (navigate→snapshot→click fires onclick→type→console capture).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…model)

Press-to-talk dictation: /voice starts recording, /voice again stops and drops
the transcript into the composer (editable before sending). No TTS.

- voice.ts: capture the mic with whatever recorder is installed (sox `rec` /
  ffmpeg / arecord), transcribe via cloud Whisper (Groq/OpenAI OpenAI-compatible
  /audio/transcriptions) when a key is set. Press-to-talk (start/stop), not
  hold-to-talk, to avoid fragile terminal key-repeat handling.
- engine: voiceStatus/startVoice/stopVoice/cancelVoice/voiceRecording
- config.voice (engine/recorder/model overrides); /voice command; /doctor line

HONEST LIMIT: no reliable cross-platform *native* CLI STT exists (Win SAPI only;
macOS/Linux have none), so cloud Whisper is the realistic default. voiceStatus()
degrades gracefully with the exact missing piece — never bundles/installs a model.

Verified: typecheck clean · 151/151 tests · capability detection + graceful
degradation self-check (recorder found, reports missing API key clearly).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…led from the TUI

Native desktop control is unavoidably native, so it ships DISABLED and never
bundled. The user installs/uninstalls it from inside Friday.

- computer.ts: 6 deferred tools (computer_screenshot/click/move/type/key/scroll)
  with permission "computer". The nut.js backend is installed on demand into
  ~/.friday/computer-use and dynamically imported at runtime (no static dep, base
  binary stays light). Tools politely guide the model to ask for install when the
  backend is absent — never crash.
- engine: computerInstalled / installComputerUse / uninstallComputerUse
- TUI: /computer-use [install|uninstall] (status notice when no arg); /doctor line

ponytail: dynamic import of an out-of-tree package + user-driven install keeps
the core dependency-free. Screenshots write to a file (tool results can't carry
images to the model yet); full vision-driven control is a later enhancement.

Verified: typecheck clean · 93/93 core+tools+shared tests · 6 tools wired
(deferred, "computer" perm) · uninstalled calls return a guiding message, not a
crash. (Live nut.js install is a user-triggered manual step.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ous-use prompt

- Entering yolo now requires explicit confirmation (YoloConfirm modal) so an
  accidental Shift+Tab can't drop you into no-prompt full-auto. Enter/y confirms,
  Esc/n cancels.
- Plan mode now ASKS for browser/computer (was deny) per requested gating:
  default+plan ask, yolo allows. Plan still hides edit/bash (read-only FS/shell).
- System prompt tells Friday it can drive the real browser (browser_*) and, when
  the task needs it, OS control (computer_*) on its own judgement — they prompt
  unless in yolo.

Verified: typecheck clean · shared+core tests pass · policies confirmed
(browser/computer = ask/ask/allow across default/plan/yolo).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… model)

/voice now opens a live modal that streams text as you speak, using the OS
speech engine — nothing to bundle, on-device when supported.

- voice.ts: embeds a tiny Swift helper (SFSpeechRecognizer + AVAudioEngine,
  shouldReportPartialResults) compiled lazily with swiftc into ~/.friday/bin on
  first use and cached. Streams {partial}/{final} JSON lines; parent narrows the
  stdin FileSink to send the stop signal and reads the final transcript.
- engine: voiceLiveAvailable / startVoiceLive(onPartial) / stopVoiceLive
- TUI: VoiceModal renders partials live; ⏎/esc stops and drops the final text
  into the composer (editable). Falls back to cloud-Whisper press-to-talk when
  native live isn't available; /doctor + voiceStatus report which path is active.

Verified: typecheck clean · 93 core/shared/tools tests · production build ·
embedded Swift compiles cleanly (swiftc 6.3.2). Live mic capture + macOS speech
permission is a user-granted manual step.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ad clearly on black

Steps surfaces #0d0d0f->#141518 and borders #2a2a2e->#3a3c44 with a matching
256-color fallback. Single-source fix — every panel/card reads these tokens.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…estion ASCII pane

Review screen confirms every answer/note before submit; 'n' attaches a note
alongside the chosen option (folded into the reply); art renders the in-question diagram.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Opening a tool shows ~8 head + ~4 tail lines with a 'view full output (+N)'
second gate; collapsing resets to the digest. ToolCard + store toggle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…emoved

Checkpoints snapshot pre-turn todos/plans; restore/redo revert them alongside
files+chat. listCheckpoints computes per-checkpoint change size via an LCS line
diff so the user sees how much code a rewind reverts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
First Ctrl+C arms (footer shows 'press again to exit'), second within 2s exits.
Exit screen prints the SAME wordmark as the empty-state Logo (shared
WORDMARK_ROWS) in brand amber; resume 'friday -s <id>' kept.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…odal

Root-fixes 'claims it worked but did nothing':
- screenshots now feed the IMAGE back to the model (Anthropic tool_result image
  blocks) so it sees the screen instead of clicking blind — the vision loop.
- withNut reports failures via isError instead of swallowing them as success.
- computerSupport() gates by OS/session (macOS/Windows/Linux-X11; Wayland/other
  reported unsupported) with permission guidance.
- ComputerModal for install/uninstall/status/device-support; /computer opens it.
- prompt updated to screenshot->read->act->verify.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ConsoleView was the one keyboard-selected list not using bandBg()/textOnAccent
like every other list (SessionHistory, ModelModal, Checkpoints, ...). Aligned.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…Ctrl+C

README claimed a 4th 'accept edits' mode that doesn't exist in modes.ts
(plan/default/yolo only). Also note Ctrl+C is now a press-twice gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
listCheckpoints diffs files per checkpoint; the full 2-D LCS table allocated
~64MB on a 4000-line file. Rolling two-row keeps it O(n). Adds a unit test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eview gate

The prior UI rework uppercased section labels/titles (STATS, PERMISSION, HISTORY,
KEYBOARD, TRUST THIS FOLDER?) but 7 TUI tests still asserted the old lowercase
strings — the whole suite was red. Updated assertions; updated the ask_user test
for the new final-confirm gate. Suite: 168 pass, 0 fail.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Removes unused imports (PostKind, PlanCard G), a write-only browser field
(currentUrl), and converts two guards to optional chains; applies biome safe
formatting/import-sort across the repo. `bun run ci` (biome ci + typecheck +
168 tests) is fully green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
katipally and others added 5 commits June 22, 2026 18:22
…cked docs

- Rename steering (/add) to /pause: soft-interrupt + composer (PauseModal),
  aliases /nudge /add, Shift+Esc; drop the fictional /pause! and "next step" flow
- Add /settings (Ctrl+G), /theme, /update modals; rebindable keybindings
- Replace command palette with inline slash menu; remove dead SelectList
- Fact-check every doc against source: pause.md (rewritten), commands.md,
  configuration.md, providers.md, tools.md, agents-and-teams.md, integrations.md
  (correct tool names, auth precedence, sessions.db path, dashboard tabs, fleet)
- Fix stale source strings: dashboard description + fleet toast (no "History"
  tab / "Tasks panel")
- Update CHANGELOG [2.0.9] to reflect what actually shipped

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@katipally
katipally merged commit 899dea5 into main Jun 23, 2026
3 checks passed
@katipally
katipally deleted the ui-ux-overhaul branch June 23, 2026 12:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant