Skip to content

Proxima v1.4.0

Choose a tag to compare

@github-actions github-actions released this 29 Aug 22:36
· 22 commits to main since this release

What's changed

Added

  • Update check on startup (lib/core/update_checker.dart) — checks GitHub for a newer release at most once per 24 hours, in a fire-and-forget background fetch that never blocks startup and swallows every failure. When an update exists the notice offers the install command, skip-this-version (remembered in ~/.proxima/update_check.json, and a later release is still announced), or remind-me-later. Proxima never installs anything itself — it has filesystem and shell access, so self-replacing its binary would make a compromised release channel equivalent to remote code execution; the user is given the command to run. Disable with check_for_updates: false; source builds (dev) never check. Version comparison is numeric, so 1.10.0 correctly beats 1.9.0. The notice appears at the first prompt rather than before the header — the check is deliberately not awaited at startup, so consuming it there would read a still-pending result and drop the notice under any real network latency
  • Shared ignore matcher (lib/tools/ignore_matcher.dart) — list_files, glob, search, search_symbol, and find_references now all skip the same paths: built-in defaults (VCS, dependency, build directories, generated Dart files), the working directory's .gitignore, and session patterns from /ignore. Previously there were three inconsistent skip lists — two byte-identical copies in the search tools, a different set in project_index, and none at all in list_files, glob, or search, so search walked node_modules and list_files recursed into .git. Full gitignore syntax is supported including negation (!keep.log), anchoring (/build.sh), directory-only rules (cache/), and **. All five walkers consult it for both files and directories, using working-directory-relative paths so path-qualified rules (vendor/lib/) and file rules (lib/excluded.dart) match — a basename alone cannot. The matcher lives on ToolRegistry and is injected as a callback, leaving the ProximaTool.execute contract — which plugins implement — unchanged; the agent loop refreshes it each turn so .gitignore edits and /dir switches apply without a restart. Clears the last unticked box in SPECS §18
  • /ignore <pattern> is now enforced — it previously stored and displayed patterns that no tool ever read, despite the README claiming it excluded them from context
  • Tests for list_files (11) and the ignore matcher (20), covering gitignore precedence, negation ordering, ** semantics, and Windows separators
  • Tests for the four previously untested tools — patch_file (12: first-vs-all replacement, backup creation, the BACKUP_PATH: marker /undo depends on, no-write-on-failure), glob (8), search (9), and run_command (11, including that a blocked command is never executed). SPECS §18 previously ticked these with a "works; no dedicated test file" caveat; every box is now backed by tests

Fixed

  • run_command and run_tests were broken on Windows — both hardcoded bash, which on Windows resolves to the WSL launcher; with no distribution installed it returns UTF-16 help text and exit code 1, so every shell command failed in the shipped proxima-windows-x64.exe. Both now use cmd /c on Windows and bash -c elsewhere, via a single shared RunCommandTool.shellExecutable / shellArgs

  • Timed-out commands are now killed, not orphaned — run_command and run_tests used Process.run(...).timeout(...), which abandons the Future but leaves the child process running: a command Proxima reported as timed out kept executing invisibly, which is unacceptable for a tool behind a permission gate. Verified — a sleep 2 "timed out" at 1s still completed its work 3s later. Both tools now use Process.start and kill the process on timeout. On Windows the whole tree is killed with taskkill /T: cmd /c <command> launches the command as a separate process, so killing the shell alone left it running — holding the working directory open and continuing work the user was told had stopped. On POSIX bash -c execs into the command, so killing the shell suffices

  • glob matched nothing on Windows — glob patterns are written with forward slashes but the tool matched them against native separators, so **/*.dart could never match lib\nested.dart. Paths are now normalised to forward slashes for both matching and output, so results are consistent across platforms

  • Transport errors surface as actionable messages (lib/providers/transport.dart) — OllamaProvider and AnthropicProvider let raw ClientException/SocketException escape, so a stopped Ollama produced six lines of socket dump instead of the message SPECS §22 promises. All three providers now route HTTP through one shared helper: a refused connection to Ollama reads Ollama not detected at <url>. Run: ollama serve, and cloud providers report the unreachable host. Because these are now LLMError(network), a configured fallback_model is finally tried for Ollama and Anthropic too

  • Unreachable servers are no longer retried — agent_loop retried a refused connection up to maxRetriesLlm times and the stream path re-issued each failure via complete(), producing six lines for one problem. A server that cannot be reached now reports once and stops

  • Per-model parameter support is discovered rather than predicted — the provider guessed from model names which models reject an explicit temperature, and was wrong repeatedly (gpt-5 rejects it, gpt-5.1 accepts it). It now sends the request and, on a 400 naming an unsupported parameter, drops that field and retries once. The same mechanism sets reasoning_effort: none when a model refuses function tools while reasoning is active (gpt-5.6-luna, gpt-5.6-sol)

  • /model picker lists only usable models — babbage-002, davinci-002, gpt-3.5-turbo-instruct, the bare chat-latest alias, and all *-codex models are excluded; codex models are deprecated or served only by /v1/responses and 404 on chat. Models are ordered so current families (gpt-5*, gpt-4.1*, o*, gpt-4o*) appear before deprecated ones instead of alphabetically, which previously buried gpt-4o under a dozen gpt-3.5-turbo-* variants



Installation

macOS / Linux — install script

curl -fsSL https://raw.githubusercontent.com/jizzel/proxima/main/install.sh | sh

macOS (Apple Silicon + Intel via Rosetta 2)

curl -fsSL https://github.com/jizzel/proxima/releases/download/v1.4.0/proxima-macos-arm64 \
  -o /usr/local/bin/proxima && chmod +x /usr/local/bin/proxima

Linux (x86_64)

curl -fsSL https://github.com/jizzel/proxima/releases/download/v1.4.0/proxima-linux-x64 \
  -o /usr/local/bin/proxima && chmod +x /usr/local/bin/proxima

Windows (x86_64) — PowerShell

irm https://raw.githubusercontent.com/jizzel/proxima/main/install.ps1 | iex

Or download proxima-windows-x64.exe below and add it to a directory on your PATH.