Skip to content

Choose a tag to compare

@kyx0r kyx0r released this 22 Oct 15:19
· 1541 commits to master since this release

Basilisk

Bug fixes:

  1. Fix incomplete recursive directory listings in :fd and file search.
    Replace the fixed 1024-entry directory queue with a dynamically growing
    path stack and open only one directory at a time, avoiding descriptor
    exhaustion. Unreadable subdirectories no longer stop scanning siblings.
  2. Fix an ex range off-by-one after a numeric line address: ;$, ;>re>
    and ,# now apply to the addressed line rather than the next one
    (:5;$c inserts at the end of line 5, :2,#+2 selects lines 2-4).
    Regressed in 6.0.
  3. Fix shell commands under a terminal resize with ish off: SIGWINCH no
    longer stops vi waiting for the command, which truncated captured
    output (filters, :r !) and returned from :! while the command was still
    running.
  4. With ish on, a terminal resize during a filter is no longer missed;
    the interactive shell owns the terminal and receives SIGWINCH, so vi
    rechecks the window size afterwards.
  5. ^C during a filter now interrupts the terminal's foreground process
    group instead of only the shell. It was ignored by shells that fork for
    -c, such as ksh, and by pipelines such as :%!sleep 5 | cat. With ish on,
    any keypress during a filter stopped vi with SIGTTIN (tty input); vi now
    takes the terminal back briefly to read the key.
  6. A shell that cannot be executed exits with status 71 (EX_OSERR)
    instead of 1, distinguishing it from the command's own failures.
  7. :e! path naming an already open buffer now switches to it and rereads
    it from disk, discarding unsaved changes, instead of only switching.
  8. :e of a file that does not exist ([n], a new buffer) no longer fails,
    so a chain after it goes on. A failed read now fails even without a
    path: :e! errors when the current file cannot be opened ([f]).

Patch changes:

  1. agent.sh:
    added :acl to rebuild agent context from the editable session log before
    every request; session and compaction transcripts now have numbered
    entries.
    The :acl mode was inspired by
    arXiv:2609.37725v1.
    Added the agr option for the tool-output guardrail (4096 bytes by
    default; 0 disables it) and :aout to retrieve saved tool output, with
    optional byte ranges and no output guardrail.
    Extended :aretry to replay either the last executed command
    or one deferred by aspec, still under the guardrail.
    Compaction retries when the agent returns without updating the session
    log, rather than accepting an unchanged log as a completed summary.
    acl above 1 runs a checkpoint every N tokens of growth, where the agent
    rates turns (:arate, 0-3) and condenses or removes log entries
    (:anote); rating 0 trims at once. acl below 0 runs a budget check
    instead: the agent checkpoints (:acheck) or defers N tokens
    (:acheck N). Ratings live in /notes/, trimmed entries in /discarded/;
    :aget prints entries, trimmed ones included.
    :ali lists the session log entries with sizes and ratings and :auli
    only the unrated turns, at any time; :acp prints the checkpoint
    instructions and :adone ends it once all turns with commands are
    rated.
    Added [N,M]ath[effort] to set a reasoning token cap of N and the
    reasoning effort, one word such as low or high; M is the ceiling the
    agent may reach for one reply. A reply counts as cut when the server
    ends its thinking with think_cut of conf.c after at least half the
    cap; think_cut is stripped from all thinking so models cannot copy
    it. A reply cut at the cap is withheld: it is not logged and its
    commands do not run. The agent then answers a budget question kept
    in /asides/, outside the session log, and nothing else runs
    meanwhile; the question interrupts a checkpoint, a budget check or a
    compaction and those resume afterwards. :acap alone keeps the cut
    reply, :acap N with N above the cap discards it and replies again
    under N, and text after N is a note only the new reply sees. Retries
    within budget question are consecutive, up to 5; after that the
    answer is taken as :acap.
    Whatever reply leaves of N is banked onto the caps of later replies,
    up to M, until their thinking spends it, so one raise smoothens out
    across many turns.
    Added :=p to print lines with line numbers.
    Added :ata to cap thinking by a percentage of its recent average in
    place of N (0 disables, a bare :ata toggles between 0 and 100). Each
    accepted reply that thought moves the average a quarter of the way to
    its tokens, and one cut at its cap counts as twice the cap, so cuts
    raise it; replies are counted with :ata off too, and :ath restarts the
    average. ast reports the cap, the bank and the average.
    Added :agoal to set a goal (a bare :agoal clears it). While it is set,
    a reply without commands does not end the run: the agent is asked
    whether the goal is finished and keeps working until it clears it;
    ^C and the tool round limit still end the run. ast reports the goal.
    Switching to an already open buffer with :e tells the agent the buffer
    was not reread from disk and that :e! rereads it.
    The :ar option now has three states, default 1: drop reasoning, log
    it without printing it, or log and print it.
    Added :ato to detach a running agent shell command after N seconds,
    disabled by default (0); a bare :ato toggles between 0 and 30. The
    command keeps running in the background (status 124, its own process
    group, output to a file; a later result reports its exit status).
    Session logs now live in a directory named with the session start time,
    $HOME/.nextvi/logs/YYYYmmdd-HHMMSS, or under log_dir; a colliding name
    takes a -N suffix, so concurrent sessions do not overwrite each other.
    A new /asides/ temporary buffer, saved with the session logs, holds
    side exchanges: compactions, checkpoints, budget checks and :acap
    questions, instead of reusing the /sc/ scratch buffer.
    max_tool_rounds defaults to 0 (unlimited) instead of 300.

Source commits:
master ba3c1c1
manual 7b95ccd
patches 4415766
patch2vi bbfddfb
test 8eab22a