Skip to content

Releases: opensec-git/Pi-Bolt

Pi-Bolt 0.8.6

Choose a tag to compare

@github-actions github-actions released this 15 Oct 09:11
880a260

Pi-Bolt 0.8.6 runs Pi 1.2.0. Everything else is 0.8.5.

Pi 1.2.0

Everything in Pi 1.2.0, among it:

  • OpenRouter model lists per key: with an OpenRouter key, /model lists only the models that key may use, with its context
    size, output limit and prices, including regional endpoints set in models.json.
  • Configuration schemas: add $schema to settings.json, models.json, keybindings and themes for validation and
    completion in your editor.
  • Copying over remote sessions: PI_CLIPBOARD_OSC52=1 sends copied text to a remote client's clipboard when Pi-Bolt cannot
    tell it runs remotely, for example in a multiplexer attached from another machine.
  • Codemode: tool declarations show input constraints (integer, minimum, maximum, default), and codemode rows show how long a
    script has run.
  • pi-bolt -p exits 1, with a warning, when the answer was cut off at the model's output limit.
  • Anthropic requests that the provider refuses for the size of the strict tool set are retried once; "The upstream provider
    returned an error" is retried like other temporary provider errors.
  • MCP: tool calls accept structured content that is not an object, servers with resources register their tools at once, and a
    call cancelled while waiting for a sign-in refresh is not sent.
  • Key bindings that name a shifted symbol, such as ctrl++, match under the Kitty keyboard protocol.
  • On Windows, reading or writing auth.json retries briefly instead of failing while a previous lock is still being removed.

For extension authors

Pi 1.2.0 changes two things extensions can see:

  • before_agent_start also fires for runs that pi.sendMessage(..., { triggerTurn: true }) starts. Its event has a
    messageType: "user" events carry prompt and images, "custom" events the starting message. A handler meant only
    for prompts should check event.messageType === "user".
  • The session counts as busy while a run starts: pi.sendUserMessage() then needs deliverAs.

OpenSec's extensions (opensec-pi-subagents, opensec-pi-todo, opensec-pi-fff) work with both unchanged.

Themes: the theme schema is now https://pi.dev/schemas/theme.schema.json. A theme that fails it is reported when it loads.

Startup

Pi 1.2.0 builds the models.json and theme schemas, and compiles a checker for each, when it starts. Pi-Bolt keeps both out of
its start: models.json is checked against the same schema as plain JSON Schema, generated from 1.2.0's definitions, and the
theme schema is built the first time a theme of your own is loaded.

Engine

Unchanged since 0.8.5: this release's runtimes are 0.8.5's.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh
irm https://pi-bolt.opensec.in/install.ps1 | iex
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-win32-x64.zip Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others.
pi-bolt-win32-x64-jit.zip Windows, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.

Pi-Bolt 0.8.5

Choose a tag to compare

@Kushalkhemka Kushalkhemka released this 12 Oct 07:11
b93895d

Pi-Bolt 0.8.5 is faster and lighter where you spend your time: typing and answers in long conversations, streamed replies,
large edits and long tool output. Everything else is 0.8.4.

Faster in use

Against 0.8.0 (0.8.4 measures the same as 0.8.0), on an Apple M5 and on Linux (an AMD EPYC 7B13 VM, pinned to 4 cores):

macOS 0.8.0 macOS 0.8.5 Linux 0.8.0 Linux 0.8.5
Interactive session (5 prompts, 25 model turns): CPU 171 ms 136 ms (−21%) 253 ms 199 ms (−21%)
Interactive session: time per turn 196 ms 179 ms (−9%) 269 ms 210 ms (−22%)
One prompt with pi -p: CPU 58 ms 54 ms (−7%) 74 ms 63 ms (−14%)
pi --version: peak memory 27 MB 25 MB (−7%) 63 MB 59 MB (−6%)
Long conversation (~4.2M tokens): CPU per prompt 133 ms 108 ms (−19%) 256 ms 177 ms (−31%)
Long conversation: memory 533 MB 462 MB (−13%) 289 MB 244 MB (−16%)
Long conversation, a pause after each answer: memory 458 MB 311 MB (−32%) 182 MB 170 MB (−7%)
  • The screen redraws only what changed. Messages, tool rows and the editor keep the lines they drew; the spinner and each
    key press no longer redraw the whole conversation. Late in a long conversation that is up to 17× less work per frame in the
    default (non-fullscreen) mode, and 5× less in fullscreen. Key bindings are matched once per key press.

  • Streamed replies are read faster. OpenAI-style streams are parsed with a faster reader, and tool-call arguments are
    parsed as they arrive instead of again from the start: a 400 KB file write streams in about 50 ms instead of 765 ms.

  • Memory is given back when Pi is idle. After an answer, once Pi has been idle for a moment, it collects garbage if memory
    grew; long conversations hold much less.

  • Edits and long output are cheaper. The edit tool's preview and patch only compare the changed lines (an edit in a 230 KB
    file: 23 ms → 1 ms), long tool output is cut in one step, and truncated output is kept once.

  • Startup does less. Grammars, the image decoder, compression and network modules load when first needed; in tmux the
    hyperlink check runs in the background; on Kitty-type terminals such as Ghostty Pi is ready about 30% sooner.

  • Extensions are not called for events they do not listen to, and the session's size and name are not recomputed every
    frame.

  • Extensions load faster when stock Bun is installed too. Pi-Bolt keeps its compiled-extension cache in a folder of its own
    (@t@pi-bolt, beside Bun's @t@). Sharing one, each runtime took the other's entries for stale and compiled them again:
    with three extensions, a start after Pi on stock Bun had run took about 200 ms longer on Linux and macOS, and pi-subagents
    took 4 s instead of 0.5 s on Windows.

  • @ file completion runs its two searches at the same time.

Windows

  • The bash tool starts Git's bash.exe itself, without Git's launcher in front (the -jit build keeps the launcher, which
    its job object needs): 10 bash calls 1.6 s → 1.45 s.
  • A program started by name is looked up on PATH once.
  • An idle Pi-Bolt no longer wakes every 4 seconds once it has made a request.
  • Against 0.8.4 on an Intel Core i5-1335U laptop: interactive CPU 301 → 260 ms, CPU per prompt in a long conversation
    177 → 160 ms, its peak private memory 332 → 254 MB.

For extension authors

  • pi-tui has markStableRender() and Container.renderShared() for components whose lines do not change between frames.
    Components that do not opt in are compared with what was drawn before, so existing extensions draw as they did.
  • In session files and extension events, details.truncation.content of the read, grep, find, ls and bash tools is now empty;
    the counts are unchanged.

Fixes

  • Installing from npm handles a download base address with many trailing slashes quickly.
  • The Windows install script's tests run on any machine.

From Pi

Fixes from Pi's main branch since 1.1.0:

  • A terminal's late replies (colour or cursor queries) no longer end up as typed input.
  • Images show in Kitty-protocol terminals inside Herdr.
  • Compaction summaries leave out thinking.
  • AGENTS.md that is a symlink is found in nested git worktrees.
  • MCP OAuth refuses an issuer when no authorization server metadata was found.
  • Codex request bodies and Mistral timeouts (the timeout covers the response headers only).
  • Extensions can override the colours of the compaction status indicator.
  • Packaging works with npm 12.

Engine

Both engines change, so all three runtimes are new.

  • Faster request bodies. Text is converted to UTF-8 in one pass into a buffer of the right size, instead of growing and
    copying it: a large part of the savings in long conversations.
  • From upstream WebKit: faster replace() with an empty string, string search, parseInt and number conversion of
    strings that are not numbers, and microtasks queued without copies.
  • From upstream Bun: sliceAnsi/stripANSI of huge input; fixes to FileSink, PipeReader, child processes' standard
    output and spawnSync; the idle collection also gives back the allocator's free memory.
  • x86-64 (Linux, Windows): property lookups by a name held in a variable, and dispatch-table slots, in ahead-of-time
    compiled code (thanks to @carsteneu, #18).
  • Map and Set with long string keys compare them many characters at a time (a lookup with 64 KB keys: 7× faster).
  • macOS: what the image builder takes for an address in the code is narrower, so large numbers are not mistaken for one.
  • Windows: the sockets' sweep timer stops with the last socket (oven-sh/bun#37096), and a task left queued after a tick wakes
    the event loop (oven-sh/bun#42968).

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh
irm https://pi-bolt.opensec.in/install.ps1 | iex
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-win32-x64.zip Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others.
pi-bolt-win32-x64-jit.zip Windows, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.

Pi-Bolt 0.8.4

Choose a tag to compare

@github-actions github-actions released this 11 Oct 15:23
36a2080

Pi-Bolt 0.8.4 lets Pi-Bolt and Pi share one setup without getting in each other's way, and makes installing on Windows smoother.
Everything else is 0.8.3.

Pi and Pi-Bolt side by side

  • Pi-Bolt never changes the packages Pi loads. Both use ~/.pi/agent (logins, models, settings, sessions). Until you
    install or remove a package with pi-bolt, Pi-Bolt loads the packages in settings.json as Pi does; the first such change
    gives Pi-Bolt a list of its own (piBolt.packages, made from Pi's) and changes only that. A package you install with
    pi-bolt install is Pi-Bolt's; one you install with pi install is Pi's.
  • OpenSec's extensions load in Pi-Bolt only. opensec-pi-subagents, opensec-pi-todo and opensec-pi-fff are built for
    Pi-Bolt's runtime, and Pi on Node cannot load them. Earlier installers added them to the list Pi reads too, so Pi started
    with "Failed to load extension" for each. Pi-Bolt moves them to its own list as it starts, and the installers have it do so
    right after installing: update Pi-Bolt (pi-bolt update) and Pi starts cleanly again.
  • README: Pi and Pi-Bolt side by side.

Windows

  • The install commands are irm https://pi-bolt.opensec.in/install.ps1 | iex in PowerShell and
    powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex" in Command Prompt. The longer command the README and the
    site showed for a day, which turned TLS 1.2 on first, was blocked by Microsoft Defender; an older Windows 10 that needs TLS
    1.2 for the first download has two lines on the docs' Installation page.
  • Installing or updating from a PowerShell 7 prompt works: install.ps1 uses Windows PowerShell's own modules first (thanks to
    @Vlyn, #14).

Releases

  • A publish run again for a release, to put the site and the installers up again, skips the pi-bolt version npm has.

Engine

Unchanged since 0.8.3: this release's runtimes are 0.8.3's.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh
irm https://pi-bolt.opensec.in/install.ps1 | iex
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-win32-x64.zip Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others.
pi-bolt-win32-x64-jit.zip Windows, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.

Pi-Bolt 0.8.3

Choose a tag to compare

@Kushalkhemka Kushalkhemka released this 11 Oct 12:52
ab1f647

Pi-Bolt 0.8.3 fixes updating in place on macOS and restores 0.8.1's speed on Linux and Windows. Everything else is
0.8.2.

macOS

  • A session started before an update keeps working. Updating with the installer or pi-bolt update replaces the build's
    files, and a session of 0.8.1 that was still running stopped at the end of its next command (a tool's command, or the version
    check that ends pi-bolt update, which installed 0.8.2 and then did not return). Such a session now goes on; only the
    resource usage of its commands is not reported until it is restarted.
  • If a session or a pi-bolt update stopped like that on 0.8.2: end it (Ctrl+C), and start Pi-Bolt again. 0.8.2 was installed.

Performance

  • Linux and Windows: 0.8.2's engine read some properties of the compiled code the generic way on x86-64, which made the TUI
    start and respond a few percent slower than 0.8.1. 0.8.3 reads them as 0.8.1 did.
  • The built-in Herdr extension is set up only in a Herdr pane.
  • Measured against 0.8.0 and 0.8.1 as released (interleaved runs on the same cores): startup, a headless prompt and the TUI
    (time to interactive, five turns) are the same within 1% on Linux x86-64 and macOS, with a little less memory.

Plugins

  • scripts/build-pi.sh: when the compiler stops the build (a plugin's module over the size limit, say), the build shows the end
    of what the compiler printed and where all of it is, rather than nothing (#8).

Engine

  • Typed fields (useAOTTypedFields, off in every build) are off on CPUs other than ARM64, whose compiled accesses do not check
    them; the table of types is as in 0.8.1.

The runtimes

From the engine trees that patches/webkit.patch and patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}):
WebKit 927e43f44e123e14ae9bab949fa51bd5d78cb171, Bun 38c350d92af2b622768f89794c6710ed03ef6202.

Runtime Built on bun.exe / bun SHA-256
Windows x64 the maintainer's Windows 11 machine (Intel Core i5-1335U), ThinLTO, Control Flow Guard 777fbb38a28a33a28ee93d87aaa56bd61f8d91a78b8fc5ca00bcf5ebb664035b
Linux x86-64 a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot 96bf1c743a75d68fda3b21353027768c7d3ec0e67a2bbc7d221dc67157d200bb
macOS arm64 the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO 874bd2e2a1b0e041e81398e2a55891544ca449d4cf81228db405adf9ad40a756

Linux, Windows, npm installs and new installs were not affected by the macOS update issue.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-win32-x64.zip Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others.
pi-bolt-win32-x64-jit.zip Windows, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.

Pi-Bolt 0.8.2

Choose a tag to compare

@Kushalkhemka Kushalkhemka released this 11 Oct 10:38
ccff717

Pi-Bolt 0.8.2 runs Pi 1.1.0 on Linux x86-64, macOS on Apple silicon and Windows x64. It works with Herdr, offers opensec-pi-fff,
and has many fixes for Windows, the installers and the engine.

Herdr

In a Herdr pane, Pi-Bolt shows up as pi-bolt in Herdr's sidebar and in herdr agent list:

When Herdr shows
Pi-Bolt starts, or a run ends idle (done, until you look)
A run is going, or background subagents still are working
An extension waits for an answer during a run (a dialog, or the herdr:blocked event of pi-ask-user and pi-subagents) blocked, with its message
You quit the pane is free again
  • Sessions come back. Pi-Bolt hands Herdr the command that reopens its session, pi-bolt --session <file>, so after a Herdr
    server restart the same conversation is back in the same pane. This needs Herdr 0.9.2 or later and pi-bolt on the PATH of
    the Herdr server: start Herdr from a terminal, not with brew services.
  • Only the interactive session reports. pi-bolt -p, JSON and RPC runs, and subagents started inside Pi-Bolt do not take
    over the pane of the session that started them.
  • Herdr's own Pi integration is not needed, and not used. The file herdr integration install pi writes reports as pi
    and restores with pi --session, which starts Pi, not Pi-Bolt; Pi-Bolt does not load it. Pi, which shares ~/.pi/agent,
    still does.
  • pi-herdr, which starts other agents in Herdr panes from a Pi
    session, works in Pi-Bolt (pi-bolt install npm:@andrewjacop/pi-herdr). Herdr starts Pi agents as pi, so the Pi agents it
    spawns run Pi, which must be installed; Claude Code, Codex and the others need only their own CLIs. Pi-Bolt turns off
    pi-herdr's own report of its pane (PI_HERDR_NO_SELF_REPORT=1), which would show the pane as pi and lose the resume command.
  • On Linux and macOS the reports go to Herdr's socket, with no process started for each; on Windows they go through the herdr
    executable of the pane (HERDR_BIN_PATH), as Herdr recommends there.
  • Outside Herdr nothing changes. "-builtin:herdr" in the extensions setting turns it off.

Extensions

  • The installers offer opensec-pi-fff: pi-fff's fast find, grep and @-mentions, as fast on the default build as pi-fff with the
    JIT (not offered when @ff-labs/pi-fff is installed).
  • opensec-pi-todo 2.13.1: the todo panel now closes once the work is done, and finished tasks no longer come back after
    compaction or /reload.
  • scripts/build-pi.sh --plugins-from-installed compiles in the extensions installed on this machine: it generates the
    manifest folder that docs/PLUGINS.md asks for (scripts/gen-plugin-manifest.mjs), with --plugins-only
    and --plugins-exclude to choose (Windows: -PluginsFromInstalled). Thanks to @toadkicker (#10).
  • docs/PLUGINS.md: what to do when a plugin's module is over the compiler's size limit, and when a build stops without saying
    why (#7, @toadkicker).
  • The tool-conflict hint links to a new README section, "Pi and Pi-Bolt side by side" (piBolt.packages).

Windows

  • Stopping a command ends everything it started, also the programs a Git Bash command started.
  • The bash tool passes a command to Git Bash unchanged: doubled backslashes (C:\\Users in a heredoc, a regex) are kept.
    Git Bash is found wherever Git for Windows is. A shellPath that is not a bash (cmd.exe, PowerShell) is refused with a
    message.
  • A bare program name in a tool's command is looked up on PATH only, not in the working folder.
  • read, write and edit take Git Bash's /tmp for the user's temporary folder.
  • Ctrl+Break and closing the console window shut Pi-Bolt down as SIGTERM does (the terminal is restored, extensions get
    session_shutdown).
  • A link's click opens web and mail links and local images, text and PDFs; any other local file is shown in Explorer.
  • The find tool's path patterns: escapes and classes (src/[[]id]/*.ts) and \ as a separator.
  • A trusted folder stays trusted in any letter case; a project's settings apply to the session directory once it is trusted.
  • install.ps1: an install folder outside the profile is checked together with the folders above it; extensions are installed
    and removed from Pi-Bolt's own folder; the install command turns TLS 1.2 on first (README, site).
  • pi-bolt update leaves PATH as the user left it.
  • docs/TROUBLESHOOTING.md has a Windows section; docs/BUILDING.md covers building on
    Windows.

Install and update

  • install.sh stages the download in the install folder: a /tmp mounted noexec no longer stops an install or an update
    with "the downloaded executable does not run on this system". A download that fails or is stopped is removed.
  • pi-bolt update downloads the installer with curl or wget, whichever there is, and runs it from the home folder.
  • On macOS the PATH line for bash goes in the file a login shell reads (~/.bash_profile).
  • The npm launcher removes the builds of earlier versions from ~/.pi-bolt/npm once a new one is installed.

Pi-Bolt

  • MCP: a sign-in page is opened over https, or http to this machine, as the token endpoint already was.
  • Bedrock: a tool call whose stream ends without its contentBlockStop gets its full arguments.
  • bash: the full output of a command that printed more than the output file holds ends with what the command printed last.
  • A finished message is lexed in full, so its final rendering is what the whole text gives.
  • --smol is not left in process.execArgv.

Engine

  • x86-64: a function constructed by calling it unwinds an exception it throws with the stack aligned as C++ expects.
  • Inlined code reads which items of a spread are spread from its own code; a module variable declared with var at more than
    one place is not taken to keep its first value; a regular expression search from past the end of a string finds nothing at
    once; off ARM64, a typed field whose structure has to be checked is read the generic way.
  • The build without the JIT keeps the JIT off also where it cannot open its own file (no /proc).
  • macOS: resourceUsage() of a child process is the program's own (it was pi-spawn's, about 1 ms); a sync spawn in a process
    group of its own starts directly; a Pi-Bolt started with two of descriptors 0 to 2 closed keeps its spawn helper.
  • fs.WriteStream: a batched write that is retried after a short write goes on at the right position.
  • The runtime stamp includes the linker-order hints (profiles/runtime-*.hints), so a change to them builds new runtimes.

The runtimes

The engine changed, so the runtimes of this release were built by hand (RELEASING.md).
From the engine trees that patches/webkit.patch and patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}):
WebKit b553f99e901bf720ece4b679123e50fcfb657aa0, Bun 38c350d92af2b622768f89794c6710ed03ef6202.

Runtime Built on bun.exe / bun SHA-256
Windows x64 the maintainer's Windows 11 machine (Intel Core i5-1335U), ThinLTO, Control Flow Guard 3ba3fe7d6f5bc35265ff4540fd0485dd493da9817f6b3f3a62e9f86564b23394
Linux x86-64 a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot 6a65d31165a9d9a37eb0690d3e4caa11f8c19d5be42e9bfe3bd8065d66bc1db3
macOS arm64 the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO 80499e790a2bf9287b330c51b2583fa24101ba8703aae4a6a0680277625e9c30

A runtime is not yet built bit for bit the same twice, so these are what was built, not what anyone would get. Tested on each
platform: tests/aot 61/61 (new: edge-cases.mjs), tests/runtime 6/6 and Pi's checks on every build; on Linux also the old
distributions and CPUs (tests/compat: CentOS 7, Debian 9, Amazon Linux 2, Haswell to Nehalem).

Releases

  • release: a dry run of the latest release takes its runtime from the signed release. tag tags a version bump also when
    pi-bolt moved on only with files ci ignores. fetch-sources checks an existing checkout against sources.json and the
    patch, and stops when it is another engine's.
  • The site has documentation: pi-bolt.opensec.in/docs.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-win32-x64.zip Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others.
pi-bolt-win32-x64-jit.zip Windows, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.

Pi-Bolt 0.8.1

Choose a tag to compare

@github-actions github-actions released this 11 Oct 03:32

Pi-Bolt 0.8.1 runs Pi 1.1.0 on Linux x86-64, macOS on Apple silicon and Windows x64. pi-fff works on the default build, and
installing with npm or Bun is easier.

Extensions

  • pi-fff works without the JIT. On the default build, pi-fff stopped at "FFF init failed: bun:ffi requires the JIT". It now
    uses its Node.js backend there (the same native search library), with nothing to set up; the -jit build uses its Bun backend
    as before.

Install

  • npm and Bun: npm install -g --allow-scripts=pi-bolt pi-bolt and bun add -g --trust pi-bolt. Both package managers now
    ask before running a package's install script, which on Windows puts the executable in place.
  • When a build is not on npm yet, the installers say "not available from npm; downloading from GitHub instead", rather than
    that the download failed.

Benchmarks

  • 0.8.0 measured on Linux and macOS against Pi 1.1.0 on Bun and Node, and against PiG and oh-my-pi in the same runs
    (docs/BENCHMARKS.md). The site shows them too.

Installer

  • install.sh refuses checksums that say they are another release's, as install.ps1 does: an older release, signed all the
    same, served as a newer one, is no longer installed as the newer.

Engine

  • On Windows: an idle keep-alive connection is aged on a clock nobody sets (GetTickCount64), as on Linux and macOS since 0.7.3.
  • The writer of the prebuilt heap no longer stops at a pair of numbers that reads like an address of the builder's own memory;
    a word that could be a pointer there still stops it.

Corrections to earlier notes

  • 0.7.1 to 0.7.3 said the installer detects Linux or macOS: it is install.sh for those, and install.ps1 for Windows.
  • 0.7.1 said git sources are passed with --end-of-options. They are refused when the repository or ref starts with -, which
    works with every git version.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or pi-bolt update, or npm install -g --allow-scripts=pi-bolt pi-bolt, or bun add -g --trust pi-bolt.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-win32-x64.zip Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others.
pi-bolt-win32-x64-jit.zip Windows, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.

The runtimes

The engine changed (Windows, and 0.7.3's and 0.7.4's changes merged with it), so the runtimes of this release were built by
hand (RELEASING.md). From the engine trees that patches/webkit.patch and
patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}): WebKit f527504e0d1d9f14c73b7aab4682fe44972507fa,
Bun 2c4f4980f78e0986a324aa46f648ce05542d9369.

Runtime Built on bun.exe / bun SHA-256
Windows x64 the maintainer's Windows 11 machine, Visual Studio 2022, LLVM 23.1, ThinLTO, Control Flow Guard 3770b10e74eb4036d5df080173ed54ae956de6891a1babfeab1b65953f4bb059
Linux x86-64 a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot fb9ee22ef65619272e3e8d5cfb80020b24590aac82d8bcbf705a301edfe8acc8
macOS arm64 the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO 24b6d7ffb4076db2fe4cfe67f65fda18f5c4aeb4e32f98c37b0ada5da0aeb785

A runtime is not yet built bit for bit the same twice, so these are what was built, not what anyone would get.

Pi-Bolt 0.8.0

Choose a tag to compare

@Kushalkhemka Kushalkhemka released this 10 Oct 18:53

Pi-Bolt 0.8.0 runs on Windows. It adds Windows x64 (Windows 10 and 11) to Linux x86-64 and macOS on Apple silicon,
with Pi 1.1.0 on all three, and the installers offer OpenSec's extensions again.

Windows x64

powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or npm install -g pi-bolt. The installer puts pi-bolt.exe in %USERPROFILE%\.pi-bolt and on your PATH, so pi-bolt
works in cmd, PowerShell and any terminal. pi-bolt update updates it in place.

On a Windows 11 laptop (Intel Core i5-1335U), against Pi 1.1.0 as released (medians;
docs/BENCHMARKS.md):

Pi-Bolt 0.8.0 Pi on Bun 1.4.2 Pi on Node 24
Launch to interactive 92 ms 177 ms 311 ms
pi-bolt --version 35 ms 98 ms 219 ms
pi-bolt -p: one prompt, 4 tool calls 113 ms 203 ms 383 ms
CPU, interactive session of 5 prompts 291 ms 805 ms 1,125 ms
CPU per prompt, 4.2M-token session 166 ms 298 ms 634 ms
Peak private bytes, interactive session 113 MB 345 MB 197 MB
Longest stall writing a 200 KB file 63 ms 43.9 s 46.6 s
  • Signed. install.ps1 and the npm package check the release's Ed25519 signature themselves (Windows has no tool for it)
    and refuse checksums of another version. A mirror is accepted only if it is signed too.
  • Hardened. DEP and Control Flow Guard; the prebuilt heap is read-only, so a write to it stops the
    program instead of changing it; the DLLs Pi-Bolt loads late come from System32 only, never from the folder it is in; the
    debugging options that reach memory or load code are off.
  • Works as Pi does on Windows: PowerShell, cmd and Git Bash for the bash tool, images (resized in a worker), extensions
    and their programs, MCP servers. A program is never looked up in the current folder.
  • Older CPUs: CPUs without AVX2 (before Intel Haswell, 2013) run the same build on its bytecode.
  • JIT build: pi-bolt-win32-x64-jit ($env:PIBOLT_VARIANT = "x64-jit" before installing) is for extensions that do heavy
    JavaScript work themselves, such as pi-lens. With the default build their work runs on the interpreter.
  • The executable has no Authenticode signature yet. SmartScreen may warn about one downloaded with a browser; the installers do
    not mark what they download, so installs through them are not affected.

From 0.7.4

  • Pi-Bolt does not load code from the directory it is started in, on Windows too: code built into the executable resolves no
    module or package from the working directory (0.7.4).
  • Extensions resolve their own packages as on Node, through their package.json (packages such as sharp load).

Extensions

  • The installers offer OpenSec's two extensions again (opensec-pi-subagents, opensec-pi-todo). 0.7.1 to 0.7.3 were
    published without extensions.txt, the signed list of their versions, so no installer offered them; it is back, and
    publishing now checks it is there.
  • pi-bolt update installs into the installation that is running. PIBOLT_INSTALL decides only for an executable that is not
    in an installation (a build of your own). Before, a PIBOLT_INSTALL left in the environment could put the update elsewhere and
    leave the running copy as it was.

Installer

  • install.sh refuses checksums that say they are another release's, as install.ps1 does: an older release, signed all the
    same, served as a newer one, is no longer installed as the newer.

Engine

  • On Windows: an idle keep-alive connection is aged on a clock nobody sets (GetTickCount64), as on Linux and macOS since 0.7.3.
  • The writer of the prebuilt heap no longer stops at a pair of numbers that reads like an address of the builder's own memory;
    a word that could be a pointer there still stops it.

Corrections to earlier notes

  • 0.7.1 to 0.7.3 said the installer detects Linux or macOS: it is install.sh for those, and install.ps1 for Windows.
  • 0.7.1 said git sources are passed with --end-of-options. They are refused when the repository or ref starts with -, which
    works with every git version.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh
powershell -c "irm https://pi-bolt.opensec.in/install.ps1 | iex"

or pi-bolt update, or npm install -g pi-bolt.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-win32-x64.zip Windows. Windows 10 (1809) or 11 on x64; compiled code on AVX2 CPUs, bytecode on others.
pi-bolt-win32-x64-jit.zip Windows, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz, pi-bolt-runtime-win32-x64.zip The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon; Windows 10 1809 or later, or Windows 11, on x64.

The runtimes

The engine changed (Windows, and 0.7.3's and 0.7.4's changes merged with it), so the runtimes of this release were built by
hand (RELEASING.md). From the engine trees that patches/webkit.patch and
patches/bun.patch make on the pinned sources (git rev-parse HEAD^{tree}): WebKit f527504e0d1d9f14c73b7aab4682fe44972507fa,
Bun 2c4f4980f78e0986a324aa46f648ce05542d9369.

Runtime Built on bun.exe / bun SHA-256
Windows x64 the maintainer's Windows 11 machine, Visual Studio 2022, LLVM 23.1, ThinLTO, Control Flow Guard 3770b10e74eb4036d5df080173ed54ae956de6891a1babfeab1b65953f4bb059
Linux x86-64 a Linux x86-64 VM (AMD EPYC 7B13), LLVM 23.1, ThinLTO, glibc 2.17 sysroot fb9ee22ef65619272e3e8d5cfb80020b24590aac82d8bcbf705a301edfe8acc8
macOS arm64 the maintainer's MacBook Air (M5), LLVM 23.1, ThinLTO 24b6d7ffb4076db2fe4cfe67f65fda18f5c4aeb4e32f98c37b0ada5da0aeb785

A runtime is not yet built bit for bit the same twice, so these are what was built, not what anyone would get.

Pi-Bolt 0.7.4

Choose a tag to compare

@Kushalkhemka Kushalkhemka released this 10 Oct 12:34

Pi-Bolt 0.7.4 runs Pi 1.1.0. A security fix and better compatibility with Pi extensions. Updating is recommended.

Security

  • Pi-Bolt no longer loads code from the directory it is started in. In the compiled executable, a package that Pi looked up
    by name could be found in the working directory's node_modules, and one such lookup loaded a native module. A repository
    could therefore supply code that Pi-Bolt ran. Pi-Bolt now takes its own code only from itself and the files next to it, and
    the runtime no longer resolves a module or package for code built into the executable from the working directory.
    Pi run with Node is not affected.

Extensions

  • Extensions resolve their own packages as on Node. An extension's dependencies are found through their package.json
    (exports, main), so extensions that use packages such as sharp now load. Checked against the 50 most-installed Pi
    extensions on npm: each installs, loads and runs as it does on Node, except @ff-labs/pi-fff, which needs the -jit
    build. Without Node.js installed, extensions whose packages compile native code when installed (better-sqlite3,
    node-pty) need Node.js and npm.

Building

  • Pi builds offline. Pi's model catalog is now part of the repository, so scripts/prepare-pi.sh needs no model provider
    to answer, and the same sources give the same Pi. --refresh-models fetches the catalog again. A step that fails prints
    its output (docs/BUILDING.md).
  • Internal names and messages of the macOS launcher and runtime cleaned up.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh

or pi-bolt update, or npm install -g pi-bolt. The installer detects Linux or macOS by itself.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon.

Pi-Bolt 0.7.3

Choose a tag to compare

@Kushalkhemka Kushalkhemka released this 10 Oct 07:03

Pi-Bolt 0.7.3 runs Pi 1.1.0. It uses less CPU and memory than 0.7.2 in long sessions and with large tool output, starts
much faster from disk on macOS, and fixes a memory leak that took a real session to 59 GB.

Fixes

  • A command with very large output no longer fills memory. The bash tool (and ! commands) wrote the full output to its
    file through an asynchronous stream without waiting for it: when a command printed faster than the stream drained, the rest
    queued in memory, and each write that completed spent longer the longer the queue was. A three-day session reached 59 GB and
    a core at 100%. The output file is now written as the output arrives, so the command waits while the disk is busy; it stops
    at 1 GiB with a note, and a full disk no longer costs the model the output and exit code it already has.
  • From upstream Bun and WebKit ahead of their release: fetch no longer aborts the process when a TLS 1.2 server renegotiates;
    an FTL compiler fix for wrong NaNs (JIT builds); Linux reads OS randomness with getrandom(2).

Faster, lighter

Measured against 0.7.2, both installed from their release archives (medians; docs/BENCHMARKS.md):

macOS 0.7.2 macOS 0.7.3 Linux 0.7.2 Linux 0.7.3
pi -p with pi-bin not in memory (after a restart or update) 177 ms 64 ms
32 MB of command output, a line at a time: CPU 2.0 s 0.26 s 5.1 s 1.7 s
... peak memory 104 MB 56 MB 202 MB 128 MB
Long session: CPU per prompt (prompt 70 / 50) 73 ms 63 ms 252 ms 231 ms
Interactive session, 5 prompts: CPU 131 ms 125 ms 345 ms 326 ms
... peak footprint / peak memory 51 MB 46 MB 172 MB 154 MB
pi -p: CPU 30 ms 30 ms 97 ms 90 ms
... peak footprint / peak memory 32 MB 29 MB 144 MB 127 MB
Streaming a reply in tmux: CPU 592 ms 565 ms 408 ms 363 ms
pi --version: peak memory 30 MB 30 MB 80 MB 66 MB
One RPC session of hundreds of prompts: floor of memory flat +5 MB per 100 prompts flat

Where it comes from:

  • Pi: no work that grows with the whole history or output on every step: the session path is kept between requests
    instead of walked from the root (5-8 times per tool turn); a tool call is drawn again only when its arguments change; streamed
    tool arguments are parsed as they grow, not in full on every delta (Pi Messages, Mistral, the agent proxy, grammar tools);
    read, truncation, grep, edit, JSONL, MCP stdio and Anthropic's event stream go over their input once; pastes and the
    editor's undo no longer copy everything on each keystroke; ! command output keeps only what can be shown; the context is
    not copied for every request when no extension handles it.
  • Engine: fs.WriteStream writes queued data together with writev as Node does (800,000 queued lines: 10 s -> 0.3 s);
    stream queues compact in amortized constant time; mimalloc from upstream, which no longer wakes its scavenger thread on every
    turn of the event loop, with freed memory given back once 25 ms old; threads waiting for work give back their free memory;
    on Linux a collection every 5 s instead of every second while Pi waits, and the runtime's code laid out in the order Pi runs
    it.
  • macOS launcher: reads ahead, all at once, the parts of pi-bin a start needs (pi-bin.hot, recorded at build time).

For extension authors

  • BashExecutionComponent.getOutput() returns the end of a ! command's output, at most its last 200,000 characters, not all
    of it: the component no longer keeps a command's whole output in memory.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh

or pi-bolt update, or npm install -g pi-bolt. The installer detects Linux or macOS by itself.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon.

Pi-Bolt 0.7.2

Choose a tag to compare

@github-actions github-actions released this 08 Oct 17:53

Pi-Bolt 0.7.2 runs Pi 1.1.0.

Pi 1.1.0

Everything in Pi 1.1.0, among it:

  • Claude Haiku 5.5 (anthropic/claude-haiku-5-5), with adaptive thinking up to xhigh/max effort.
  • --tools adjusts the defaults with +name and -name entries: pi-bolt -t +codemode,-write.
  • Program status (OSC 7501): terminals and agent dashboards that support it see whether Pi-Bolt is working, waiting on a dialog or a login, done, or failed. PI_PROGRAM_STATUS=1|0 overrides detection.
  • Classifier models: OpenAI's GPT-6 Luna through the Decisions API, images in codemode's models.classify(), and native llama.cpp decision models through /v1/systemone.
  • Tool results record how long they ran (durationMs), and Took stays right after reloading a session.
  • /mcp opens at once and updates while servers connect; an MCP sign-in can be cancelled with Esc at every step.
  • Fixes for codemode output items running together, server_busy and Mistral finish_reason: "error" responses not being retried, long-prompt pricing tiers undercounting costs, Anthropic browser login when its port is taken, clipboard paste in Termux, and Markdown links in Herdr.

Install

curl -fsSL https://pi-bolt.opensec.in/install.sh | sh

or pi-bolt update, or npm install -g pi-bolt. The installer detects Linux or macOS by itself.

Asset For
pi-bolt-linux-x64.tar.xz / .tar.gz Recommended on Linux. CPUs with AVX2 (Intel Haswell 2013+, AMD Zen+).
pi-bolt-linux-x64-baseline.tar.xz / .tar.gz Any x86-64 CPU with SSE4.2.
pi-bolt-linux-x64-jit.tar.xz / .tar.gz JIT also on, for plugins loaded at run time.
pi-bolt-darwin-arm64.tar.xz / .tar.gz macOS. Macs with Apple silicon, macOS 13 or later.
pi-bolt-darwin-arm64-jit.tar.xz / .tar.gz macOS, JIT also on.
pi-bolt-runtime-linux-x64.tar.gz, pi-bolt-runtime-darwin-arm64.tar.gz The Pi-Bolt Bun runtime, for compiling plugins in.

Linux x86-64 with glibc 2.17 or later; macOS 13 or later on Apple silicon.