2.0.9: UI/UX overhaul, /pause, settings & fact-checked docs#12
Merged
Conversation
…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>
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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/addsteering. The fictional/pause!/ "next step" flow is gone./settings(Ctrl+G, alias/config),/theme,/updatemodals; rebindable keybindings (~/.friday/keybindings.json).SelectList/CommandPaletteremoved.Docs — fact-checked against source
Every doc verified against actual code. Fixes include:
pause.mdrewritten (was entirely fiction:/pause!, "+ next step" button, inline-text handling — none exist).apply_patch,multi_edit,ask_user,board_claim_file,board_release_file).auth.jsonwins, not env),sessions.dbpath, dashboard tabs (no "History"), fleet backends.Verification
Local CI green: 187 tests pass, typecheck clean, biome clean, version-drift guard OK.
🤖 Generated with Claude Code