Skip to content

efr 0.0.2

Choose a tag to compare

@github-actions github-actions released this 07 Oct 23:41
· 1557 commits to main since this release

The reply view is new: replies stream without lag, a status row shows what runs, and
tool calls and questions have a clear layout. This release also fixes two sandbox
bugs.

Added

  • Streaming drafts. efrd sends the text of a running turn to the reply view every
    16 ms, and never writes these drafts to the event log. A reply now reaches the
    screen about 7 ms after the model sends it (it was about 100 ms).
  • A status row under the reply while a turn runs: a spinner, the state (waiting for
    the model, thinking with the title of the reasoning, writing, preparing a tool call,
    stalled, waiting for you) and the time. The clock stops while a question waits.
    render.motion = false turns the shimmer off.
  • An end-of-turn line, such as done in 24s, 18.2k tokens in, 1.1k out
    (render.turn_summary).
  • A progress indicator in the terminal tab during a turn (OSC 9;4), in Ghostty 1.2 or
    newer, kitty 0.47 or newer and Windows Terminal, but not in tmux, GNU screen or
    zellij (render.progress).
  • Colour roles for every part of the view: text, muted, accent, heading, link, code,
    success, warning, error, quote and the diff roles. [render.colors] sets one role,
    and render.palette loads a theme file with a [colors] table and an optional
    code_theme (a .tmTheme file). The eggfriedrice.nvim colour scheme ships such a
    file as extras/efr/eggfriedrice.toml.
  • render.theme = "auto" with render.theme_dark and render.theme_light. The zsh
    plugin asks the terminal for its background once and sets EFR_TERMINAL_BG.
  • Character widths by grapheme cluster in Ghostty, so emoji and flags no longer shift
    the live zone.
  • Debug log lines with the time of each step of a call (phase=... elapsed_ms=...).
    docs/sandbox.md tells how to read them.
  • CHANGELOG.md, and release notes that come from it.

Changed

  • Tool calls are blocks: · $ command in the code colour, a muted │ output tail
    while it runs, and a result row (✓ 0.4s or ✗ exit 3 · 2.0s). A failed call keeps
    its last 3 output lines. A long command wraps at the width and is never cut.
  • Questions are cards with a thin muted bar and a title such as
    ? allow outside the sandbox. After the answer, a card gives its place to one line,
    ✓ allowed or ✗ denied, and the command shows only once.
  • One blank line between blocks, and none inside a block.
  • Markdown: no label above plain code blocks, a file name when the fence names one,
    inline code in the code colour, one heading colour, quotes in italic, and a rule of
    at most 40 columns.
  • The default accent colour is yellow (ANSI slot 3).
  • sudo -k (and -K, --reset-timestamp, --remove-timestamp) can stand beside the
    one command of a line that runs outside the sandbox.
  • A failed call no longer says (sandbox) in its result; the end-of-turn note says
    that the turn ran in the sandbox.
  • A question no longer says that its target exists. It still says when a target is a
    directory, because a write grant then opens all of it.
  • The reply view no longer prints answer sent after a password answer.

Fixed

  • A redirect to /dev/null (and to the other nodes of the sandbox's own /dev) was a
    write exit in auto: the line asked you and then ran outside the sandbox with your
    full rights. It now runs in the sandbox with no question.
  • A command line that wraps inside a word no longer looks like two words; such a cut
    is marked with ↩.
  • When stdout is not a terminal, a call's rows come after its question and answer, as
    on a terminal.
  • The status row no longer shows the reasoning title of an earlier model call.
  • Ctrl+C during a turn says how long the turn ran.
  • The cursor always comes back, also after a signal.

Security

  • A path below /dev/fd/<n>/ or /dev/pts/<n>/ counted as a node of the sandbox's
    own /dev, so a write such as echo x > /dev/fd/3/authorized_keys could run with no
    question. Now only /dev/fd/<n> and /dev/pts/<n> themselves count; a path below
    them is a write exit that only you can allow.