@earendil-works/pi-durable
1.4.0 · 21 Oct 2026MIT387.7k / weekRepositoryHomepagenpmAtom feed
Latest releases
- 1.x · latest line
1.4.0
21 Oct 2026Image input for classifiers: codemode
models.classify()acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter. See Use classifier models and Codemode.Models Configuration reference: every provider, model, model override, and compatibility field of
models.json, generated from its schema. See Models Configuration.Summaries without a fixed output cap: compaction and branch summaries use the model's output limit, so long reasoning no longer makes them fail. See Compaction.
New Features
Image input for classifiers: codemode
models.classify()acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter. See Use classifier models and Codemode.Models Configuration reference: every provider, model, model override, and compatibility field of
models.json, generated from its schema. See Models Configuration.Summaries without a fixed output cap: compaction and branch summaries use the model's output limit, so long reasoning no longer makes them fail. See Compaction.
Codemode waits for a free worker: parallel scripts and in-process subagents queue instead of failing, and
PI_CODEMODE_MAX_WORKERSraises the limit. See Codemode limits.Rex terminal support: OSC 8 hyperlinks, truecolor, and inline images.
Added
Added a Models Configuration reference generated from the
models.jsonschema, listing all provider, model, model override, and compatibility fieldsCodemode
models.classify()now acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter, and lists Clef Omni and Jev 1.14 on Workers AI.Provider-level
compatinmodels.jsonnow also applies to classifier models, with the System One fieldsimageInputandsendImageOptInHeaderfor proxies that serve another service's classifiers. Extension classifier models acceptcompattoo.Added
MiniMax-M3.1-Flashto theminimaxandminimax-cnproviders, with thinking levels low through maxAdded support for the Rex terminal: OSC 8 hyperlinks, truecolor, and inline images (#11131, #11150
Changed
Provider attribution headers now come from pi-ai's client identity. Extensions'
before_provider_headershandlers no longer see the OpenRouter, NVIDIA NIM, and OpenCode attribution headers; returningnullfor one still removes it. Cloudflare requests send pi's detailedUser-Agentinstead ofpi-coding-agent, as do GitHub release checks for tool downloads, and OpenCode requests sendx-opencode-clientwhenever attribution is enabled, not only with a session.generateSummary()andgenerateSummaryWithUsage()now ignore theirreserveTokensparameter. Summary requests use the model's output limit instead.Changed the default GitHub Copilot model from
gpt-5.4, which Copilot retired, togpt-6.1-sol.Changed the default NVIDIA model to
nvidia/nemotron-3.5-super-vl-120b-a12bChanged the default Xiaomi model to
mimo-v2.6-profor thexiaomiand Xiaomi Token Plan providers, sincemimo-v2.5-proleft the catalog.Grok 4.3 and Grok 4.5 on the
xaiprovider now offer thexhighthinking level.Sign in with ChatGPT: ChatGPT Business workspace usage-limit errors are not retried and tell the user to ask their workspace admin to increase the limit.
Fixed
Fixed compaction and branch summaries failing with "generation hit the token cap" when reasoning used most of the fixed summary output limit. Summaries now use the model's output limit, and
compaction.reserveTokensonly controls when compaction starts (#9512, #9075).Fixed
models.schema.jsonmissing descriptions for provider and model fields, so editors showed no hints for themFixed
pi updatefailing with "Managed install marker is missing or invalid" whenmanaged-install.jsonstarts with a UTF-8 BOM, which Windows PowerShell 5.1 adds when it rewrites the file.Fixed HTML export showing literal asterisks for Markdown bold and italic next to CJK punctuation (#3353, #10154)
Fixed the terminal staying in mouse-tracking, focus-reporting, Kitty keyboard, and alternate-screen modes when pi exits without its normal terminal teardown, which flooded the shell prompt with escape sequences
Fixed concurrent extension
select/confirm/input/editordialogs and inlinecustom()components in interactive mode: a second dialog replaced the first and the first promise never settled; closing the visible dialog now shows the previous one again (#11166, #9909)Fixed pasting in the shell hanging after copying text in pi and suspending it with Ctrl+Z on Linux: the background
wl-copy/xclip/xselprocess that keeps serving the clipboard was suspended along with piFixed codemode scripts failing immediately when both codemode workers are busy, for example with parallel codemode calls or in-process subagents. Scripts now wait up to 60 seconds for a free worker, and
PI_CODEMODE_MAX_WORKERSraises the limit of two workersFixed extensions failing to load when importing
@earendil-works/pi-ai/models(e.g. forclampThinkingLevel) by exposing the subpath through the extension loader aliases and virtual modulesFixed
mcp.jsonfiles that start with a UTF-8 BOM failing to parse, which skipped all their MCP servers and madepi mcp add/pi mcp removefailFixed
/compact <instructions>ignoring the instructions when summarizing the start of a turn that compaction splits. When the split turn was the only new content since the last compaction, the instructions were ignored entirelyFixed resumed sessions and
/treenavigation leaving extension tools inactive when the branch recorded its tools before they were registered, such as tools from extensions installed after the session started. Extension tools the branch never added or removed are now active unless they are registered withdefaultActive: false(#11062, #11075)Fixed sessions breaking after recovery from a response cut off at the output limit: the truncated tool call was omitted but its tool results were kept, so providers rejected every later request (#11227, #11233
Fixed the
greptool followingRIPGREP_CONFIG_PATH, where options such as--fixed-stringssilently changed regex searches into literal ones. The tool now runsrg --no-config(#11203, #11230Fixed Windows shell detection rejecting runnable Microsoft Store shell aliases
Fixed Windows shell detection missing PowerShell outside
PATHand the legacy WSLbash.exelauncher when Windows is not installed inC:\Windows. pi now checks%ProgramFiles%\PowerShell\7,%SystemRoot%\System32\WindowsPowerShell\v1.0, and%SystemRoot%Fixed GitHub Copilot sessions with large request bodies, such as many images, failing with HTTP 413
failed to parse requestinstead of compacting and retryingFixed the
openai-codexprovider offeringgpt-5.5andgpt-5.3-codex-spark, which always fail for ChatGPT accountsFixed whitespace-only tool output (for example a bare
\r\nfrom bash) making OpenAI Completions, OpenAI Responses, and Google requests fail with a 400Fixed automatic retry not triggering for more gateway upstream failures,
stream disconnected before completionerrors relayed by Codex CLI proxies, and transient Google Vertex OAuth token refresh failures, and retrying errors because of digits inside request ids or byte counts (#10920, #11057, #10996)Fixed OpenAI Responses models losing the prompt cache on every deferred tool load after a tool was removed
Fixed Cloudflare Workers AI classifier pricing: Clef Flash costs $0.038 and Jev $0.042 per million input tokens instead of Jev being listed as free.
Fixed an unclosed
$$display-math block swallowing or corrupting every Markdown table after itFixed Markdown bold and italic not rendering next to CJK punctuation
Fixed
@file autocomplete returning no results for queries containing regex metacharacters such as[or(
1.3.0
15 Oct 2026Choose where
/shareuploads:sessionShareDestinationselectsauto,gist, orradius. See Sessions and context and Export or share a session.Cache-preserving thinking level changes on OpenAI GPT-6: changing the thinking level mid-session with an API key keeps the prompt cache.
Kimi Code over Chat Completions: tools added mid-conversation no longer invalidate the prompt cache.
models.jsonbase URL overrides must now include/v1. See Providers.
New Features
Choose where
/shareuploads:sessionShareDestinationselectsauto,gist, orradius. See Sessions and context and Export or share a session.Cache-preserving thinking level changes on OpenAI GPT-6: changing the thinking level mid-session with an API key keeps the prompt cache.
Kimi Code over Chat Completions: tools added mid-conversation no longer invalidate the prompt cache.
models.jsonbase URL overrides must now include/v1. See Providers.Clean model switching: thinking from a previous model is dropped instead of being shown to the new model as text.
Resumed sessions keep their active tools:
--tools +name/-nameapplies on top of them. See Tools.
Added
Changing the thinking level mid-session on OpenAI GPT-6 models (API key) now keeps the prompt cache
Added the
sessionShareDestinationsetting to choose automatic, GitHub gist, or Radius uploads for/share
Changed
Changed the
kimi-codingprovider to use OpenAI Chat Completions athttps://api.kimi.com/coding/v1, the protocol used by the official Kimi Code client. K3, K3-256K, and Kimi For Coding now accept tools added mid-conversation without invalidating the prompt cache.models.jsonoverrides of thekimi-codingbase URL must now include/v1Changed model switching to drop thinking blocks from earlier assistant messages produced by a different model, instead of sending them as plain text. The new model previously saw the old model's reasoning as part of its replies and could start writing its own reasoning into the visible answer
Fixed
Pinned internal Pi dependencies to exact release versions to prevent fresh installs from mixing incompatible packages
Fixed resumed sessions dropping tools activated during the session. Resume now restores the session's active tools, with
--tools +name/-nameentries applied to them, unless--toolswith tool names,--no-tools, or--no-builtin-toolsselects tools explicitlyFixed stopping a codemode script or reaching its deadline waiting for a non-interruptible built-in to return on Bun
Fixed repeated codemode timeouts or aborts accumulating surviving workers; admission now limits live workers to two across sessions, counting cancelled workers until actual exit
Fixed
--modelchoosing a provider by catalog order when several providers offer the match; Pi now prefers the provider with credentials and otherwise reports the ambiguity.--modelsandenabledModelsadd a model for each provider that offers it and warn about the ambiguityFixed
readline-range labels for numeric-string or null arguments in the TUI, session tree, HTML exports, and examplesFixed the Nix flake build failing when a provider switched APIs: the model catalog pin is now refreshed from the newest published catalog when its model API groups differ, and releases pin the newest catalog and build with it before tagging
Fixed the Nix package putting its Node.js first on
PATH, which made bash tool shells use Pi's Node instead of the user'snode/npm. Pi's Node is now only a fallbackFixed prompt templates dropping empty quoted arguments (
""or''), which shifted later positional arguments and prevented positional defaults from applyingFixed the Nix package build failing in its install check because it still expected chord and esbuild, which Pi no longer depends on
Fixed tool-call argument parsing dropping fields when a string contains an invalid
\uescape such as\usepackageFixed Anthropic and Bedrock Claude requests failing with a 400 when an error tool result contains images; the images are now sent after the tool results of the turn, so the model still sees them
Fixed OpenCode Go Gemini models failing with a 404 by moving OpenCode Zen and OpenCode Go to the
opencode.ai/inferenceendpoints, and added Google Generative AI support to the OpenCode Go providerFixed OpenCode Go MiniMax M2.7 failing with "Model does not support this protocol" by using the Anthropic Messages API
Fixed automatic retry not triggering for gateway
Unable to forward upstream streamerrorsFixed automatic retry not triggering for
The service is temporarily unavailableerrors, which also made compaction fail on the first attemptFixed OpenAI-compatible responses showing thinking after the answer when a proxy such as LiteLLM sends reasoning and content in the same stream chunk
Fixed Gemini 4 Argon requests on Google Vertex failing with "Thinking budget is not supported", and its thinking level being ignored on the Gemini API
Fixed Xiaomi MiMo models failing with a 400 at the
minimalthinking level; they now expose only theoffandhighlevelsFixed
openai-codex/gpt-6.1-solusing a 272K context window instead of the 500K window Codex now providesFixed tool calls whose final arguments are malformed JSON silently running with only the fields parsed before the error; they now fail validation and show the model the raw arguments it sent
Fixed Claude Haiku 5.5 and Claude Opus 5 not supporting the
offthinking levelFixed
done()of an extension'sctx.ui.custom({ overlay: true })closing the topmost overlay instead of its own, which left the finished overlay on screen and another extension's dialog unresolved (#10648, #10999
1.2.0
12 Oct 2026- breaking
Published generated configuration schemas for models, settings, keybindings, and themes at
https://pi.dev/schemas/*.schema.json. The theme schema moved tohttps://pi.dev/schemas/theme.schema.json; themes loaded during startup now receive the same schema validation as later reloads. Update theme$schemareferences, define reusable colors undervars, and remove unsupported metadata (#9880, #10751 - breaking
Changed
before_agent_startto also fire for runs started bypi.sendMessage(..., { triggerTurn: true })while idle.BeforeAgentStartEventis now a union onmessageType:"user"events carrypromptandimages, and"custom"events carry the startingmessageand noprompt. Messages returned by handlers are added to both kinds of run, and pendingdeliverAs: "nextTurn"messages are delivered with the custom-message run. Handlers that should act only on user prompts must checkevent.messageType === "user"(#10267, #5581, #10739 - breaking
Changed the session to count as busy while a run starts, including during
before_agent_starthandlers:ctx.isIdle()is false,pi.sendMessage()queues into the starting run instead of starting a second run that failed with "Agent is already processing",pi.sendUserMessage()requiresdeliverAs, and an abort requested meanwhile aborts the run once it starts
New Features
Per-key OpenRouter model lists: with an OpenRouter key, Pi lists only the models that key may use, with the key's context size, max output, and prices, including regional endpoints set in
models.json. See OpenRouter.Published configuration schemas: add
$schematosettings.json,models.json, keybindings, and themes for editor validation and completion. See Settings, Models, Keybindings, and Themes.Clipboard copies over remote sessions:
PI_CLIPBOARD_OSC52=1sends copied text to a remote client's clipboard when Pi cannot detect the remote session, such as a multiplexer attached from another machine. See Pi Process Configuration.Codemode improvements: tool declarations show input constraints such as integer, minimum/maximum, and default, and codemode rows show elapsed and total time. See Codemode.
before_agent_startfor extension-triggered runs: runs started bypi.sendMessage(..., { triggerTurn: true })go through the same setup as prompts. See Events and concurrency.
Breaking Changes
- breaking
Published generated configuration schemas for models, settings, keybindings, and themes at
https://pi.dev/schemas/*.schema.json. The theme schema moved tohttps://pi.dev/schemas/theme.schema.json; themes loaded during startup now receive the same schema validation as later reloads. Update theme$schemareferences, define reusable colors undervars, and remove unsupported metadata (#9880, #10751 - breaking
Changed
before_agent_startto also fire for runs started bypi.sendMessage(..., { triggerTurn: true })while idle.BeforeAgentStartEventis now a union onmessageType:"user"events carrypromptandimages, and"custom"events carry the startingmessageand noprompt. Messages returned by handlers are added to both kinds of run, and pendingdeliverAs: "nextTurn"messages are delivered with the custom-message run. Handlers that should act only on user prompts must checkevent.messageType === "user"(#10267, #5581, #10739 - breaking
Changed the session to count as busy while a run starts, including during
before_agent_starthandlers:ctx.isIdle()is false,pi.sendMessage()queues into the starting run instead of starting a second run that failed with "Agent is already processing",pi.sendUserMessage()requiresdeliverAs, and an abort requested meanwhile aborts the run once it starts - breaking
Changed
pi mcp list --jsonto reportresources: truefor servers that offer resources instead ofresourcesandresourceTemplatescounts; Pi no longer lists resources when connecting
Added
Added
reachesToolsto tool definitions, so tools that reach other tools (such ascodemodeandtool_search) declare which tools a call may reach; the MCP extension uses it to wait for the servers a call needs and to decide whether a replacementcodemodeortool_searchtool can reach MCP toolsAdded
aliasesto tool namespaces; codemode'sdescribeNamespace()and thenamespaceoption ofsearchTools()match them, and MCP namespaces use the server nameAdded per-key OpenRouter model lists: with an OpenRouter key, Pi lists only the chat models that key may use, with the key's context size, max output, and prices, including guardrails and regional endpoints set as the base URL in
models.json. The list is saved and used offline (#10353, #10672Added
PI_CLIPBOARD_OSC52=1to send copied text to the terminal with OSC 52 after the local clipboard write, so copies reach a remote client's clipboard when Pi cannot detect the remote session, such as multiplexer attaches from another machine or remote IDE daemons (#10826, #10835, #10114)Added elapsed time while a codemode script runs and its total time once finished to the codemode tool row, like bash rows
Changed
Changed the
showHardwareCursorsetting to use only the terminal cursor instead of also drawing Pi's reverse-video cursorChanged codemode tool declarations to show input constraints such as integer, minimum/maximum, length, pattern, and default as
@tags on property comments, so scripts see them without the tool repeating them in descriptionsChanged codemode declarations of MCP tools to spell out the result type (
content,structuredContent,isError) instead of referring toCallToolResult<T>, whichdescribeTool(),searchTools(), andALL_TOOLSshowed without defining it; the codemode description no longer includes the shared MCP typesChanged
serializeConversation()(compaction, branch summaries, bug reports) to omit thinking blocks; replayed thinking is often not in the live context, so including it could make a summarization request larger than the context it summarizes and fail
Fixed
Fixed codemode ignoring a
// @options:line that is not the first line of the script, which ran the script without the requestedtimeout_ms; the call now fails with an error before the script runsFixed Mistral streams being aborted mid-generation (e.g. during long thinking) after the request timeout; the timeout now applies only to waiting for response headers
Fixed a symlinked
AGENTS.mdin a git worktree nested inside its main repo causing no project context file to loadFixed the code mode tool description claiming every failed tool call rejects; a tool that declares an output schema resolves with its value on failure too (e.g.
bashwith a nonzero exit)Fixed runs started by
pi.sendMessage(..., { triggerTurn: true })removing system prompt sections added inbefore_agent_startafter their first tool call, which changed the prompt mid-run and broke the provider prompt cache twice per run (#10267, #10739Fixed codemode blocking the process for seconds to minutes after scripts with many
text()calls; joining the output items was quadraticFixed print mode (
-p) exiting 0 without a warning when the final response was cut off at the model's output token limit; it now prints the partial text, writes a warning to stderr, and exits 1Fixed
pi mcp login --helpand the CLI docs describing--timeoutas only the wait for the browser; it limits the whole sign-inFixed
~not being expanded in!pattern,+path, and-pathentries of theextensions,skills,prompts, andthemessettings, so entries like!~/skills/pdfmatched nothingFixed MCP servers with resources registering no tools until every resource was listed; Pi no longer lists resources when connecting, so
/mcpandpi mcp listshow that a server offers resources instead of counting themFixed MCP tool calls failing when the server returns structured content that is not an object (an array,
null, or a primitive, as MCP 2026-07-28 allows); codemode declarations of MCP tools without an output schema now typestructuredContentasunknowninstead of an objectFixed reading or writing
auth.jsonon Windows failing withEPERMwhen the previous lock folder was still being deleted; Pi now retries briefly before reporting the errorFixed OpenRouter router models such as
openrouter/autoshowing a cost of -$1,000,000 per 1M tokens; OpenRouter's negative placeholder prices are now 0Fixed Anthropic requests failing when the provider rejects the strict tool set for grammar size, tool count, or union limits; Pi now retries once with preferred tools non-strict
Fixed "The upstream provider returned an error" not being retried as a transient provider error
Fixed focused fullscreen overlays blocking mouse-wheel scrolling of the transcript
Fixed fragmented terminal color replies leaking hex values into the prompt and opening the external editor (related reports: #10256, #10657)
Fixed inline images not rendering in Herdr since 1.1.0
Fixed key bindings that name a shifted symbol, such as
+orctrl++, not matching under the Kitty keyboard protocol or modifyOtherKeysFixed the compaction status indicator embedded in a custom editor using the default muted colors instead of the editor border or thinking-level color, as the working indicator does (#10809, #10810
Fixed MCP tool calls that were cancelled or timed out while waiting for an OAuth refresh still being sent to the server once the refresh finished
Fixed MCP OAuth sign-in accepting an authorization response with an
issparameter that could not be checked because no authorization server metadata was discovered; sign-in now fails with an issuer mismatch. ReportedFixed codemode failing with a broken bridge error when Pi runs under
node --watchon Node 24 or 26
Removed
- breaking
Removed the unreleased experimental server, client, and plugin stack (
src/experimental,src/cli/experimental) and its source-only./clientand./experimental/pluginexports; none of it was part of the published package. The@earendil-works/pi-client,@earendil-works/pi-protocol, and@earendil-works/pi-serverpackages it used are removed and no longer released - breaking
Removed the dependency on
@earendil-works/chord
1.1.0
7 Oct 2026Program status reporting: terminals and agent dashboards that support OSC 7501 see whether Pi is working, blocked on a dialog or login, done, or failed. See Program status.
Claude Haiku 5.5:
anthropic/claude-haiku-5-5, with adaptive thinking up toxhigh/maxeffort.Adjust default tools with
+name/-name:--toolsentries likepi -t +codemode,-writechange the default selection instead of replacing it. See Tools.
New Features
Program status reporting: terminals and agent dashboards that support OSC 7501 see whether Pi is working, blocked on a dialog or login, done, or failed. See Program status.
Claude Haiku 5.5:
anthropic/claude-haiku-5-5, with adaptive thinking up toxhigh/maxeffort.Adjust default tools with
+name/-name:--toolsentries likepi -t +codemode,-writechange the default selection instead of replacing it. See Tools.GPT-6 Luna and image classification: OpenAI's GPT-6 Luna is available as a classifier model through the Decisions API, and codemode's
models.classify()accepts images for classifiers that support them. See Use classifier models.Native llama.cpp decision models: Julia-1, Laya, Kev, lev, and OpenJev served by llama.cpp 0.6.0 or later run natively as classifiers through
/v1/systemone. See Classification.
Added
Added
+nameand-nameentries to--tools, which change the default tool selection instead of replacing it, for examplepi -t +codemodeAdded
durationMsto the tool render context and totool_execution_endextension events: the recorded execution time of a final tool resultAdded
outputPadto the tool render contextAdded OpenAI's GPT-6 Luna as a classifier model through the Decisions API, available with
OPENAI_API_KEY(see Use classifier models)Added
imagesto codemode'smodels.classify()context, so classifiers that accept images, such as GPT-6 Luna, can judge themAdded program status reporting with OSC 7501: terminals and agent dashboards that support it see whether Pi is working, blocked on a dialog or login, done, or failed.
PI_PROGRAM_STATUS=1|0overrides detection (see Terminal setup)Added
abortedtoagent_settledsession, extension, and JSON events, so integrations can tell a cancelled run from a finished oneAdded Claude Haiku 5.5 (
anthropic/claude-haiku-5-5), with adaptive thinking up toxhigh/maxeffort and prompt caching on BedrockAdded native llama.cpp decision models: Julia-1, Laya, Kev, lev, and OpenJev served by llama.cpp 0.6.0 or later are listed only as classifiers through
/v1/systemoneinstead of as chat models (see Classification)
Changed
Changed
outputPadto also apply to!command output, tool output, and summary blocks (#9946, #10557Changed
pi mcp login --timeoutto limit the whole sign-in, including requests to the authorization server, instead of only the wait for the browser
Fixed
Fixed bash and PowerShell results losing
Tookafter reloading a session, and the liveTookincluding wall-clock steps; both now show the recorded execution timeFixed managed installs keeping every old release;
pi updatenow keeps only the new release and the one it updated from (#10392, #10511Fixed standalone binaries loading
.env,.env.local, and.env.developmentfrom the launch directory into Pi's environmentFixed
!!command headers losing their dim color once output arrivesFixed the codemode description not marking
searchTools(),describeTool(), anddescribeNamespace()as async, which led models to serialize the unawaited promise as{}Fixed codemode output items running together, so models could not tell where one
text()orconsole.log()output ended and the next began. With several text items, each now starts with a==> text N/M <==line, andconsolecalls follow the other output in one<console_output>block with one line per callFixed
/mcpwaiting for all servers to connect before opening; the manager now updates live and remains usable while enabling, reconnecting, or disabling serversFixed images being dropped as "could not be resized" when running under
node --watchon Node 24.19+ and 26.x, where Node posts its own messages on the image resize worker channelFixed clipboard paste doing nothing in Termux, and failed copies there omitting the Termux:API install hint
Fixed
!and RPCbashoutput keeping fragments of color codes, such as a straym, when a code was split across output chunksFixed MCP OAuth sign-ins that could not be cancelled while waiting on the authorization server and kept running after the session ended. The sign-in screen now cancels with Esc at every step, session shutdown aborts a running sign-in, and each request to the authorization server times out after 15 seconds
Fixed shutdown waiting up to 15 seconds to refresh an MCP OAuth token that was about to expire, only to close the server's session
Fixed the fullscreen text selection surviving session switches and other transcript rebuilds, which highlighted unrelated text in the new transcript (#9311, #10567
Fixed OpenAI models on Bedrock ignoring the thinking level and always running at Bedrock's default reasoning effort (#9331, #10142
Fixed model
headersinmodels.jsonnot overriding theoriginatorandUser-Agentheaders of Codex requestsFixed
server_busyandservers are currently busyprovider errors ending the turn instead of being retriedFixed Mistral responses that end with
finish_reason: "error"not being retriedReduced context-limit request failures by estimating input at 3.5 characters per token instead of 4 when calculating output limits
Fixed Radius models disabled by an organization owner still being listed
Fixed Anthropic browser login failing with "localhost refused to connect" when port 53692 is reserved or in use, for example by Hyper-V/WSL port exclusions on Windows: login now falls back to a free loopback port
Fixed session costs undercounting long prompts on models with prompt-length pricing tiers, such as Claude Haiku 5.5, Gemini 3.1 Pro, and GPT-5.4, through OpenCode, OpenCode Go, OpenRouter, Vercel AI Gateway, Google, MiniMax, and other providers
Fixed Markdown links not being clickable in Herdr
1.0.4
5 Oct 2026Codemode persists images:
tools.read()on an image file now gives back an image block thatimage()can show. See Call tools.Added
*patterns to--toolsand--exclude-tools, for example--tools read,codemode,'mcp__radius__*'
New Features
Tool patterns and
--no-mcp:--toolsand--exclude-toolsaccept*patterns, for example--tools read,codemode,'mcp__radius__*'keeps only one MCP server's tools.--toolsnow keeps MCP tools unless an entry starts withmcp__, and--no-mcpturns off MCP for one run. See Tools and MCP tools.Codemode persists images:
tools.read()on an image file now gives back an image block thatimage()can show. See Call tools.
Added
Added
*patterns to--toolsand--exclude-tools, for example--tools read,codemode,'mcp__radius__*'Added
--no-mcpto disable the built-in MCP support for one run
Fixed
Fixed syntax highlighting losing colors after the first line of multiline strings and comments in fenced code blocks
Fixed codemode scripts not receiving images from
read:tools.read()now resolves to an image block for image files, whichimage()showsFixed MCP OAuth sign-in failing with
invalid_redirect_urion servers with OpenID Connect client registration, such asmcp.modem.dev: pi now registers as a native clientFixed
--toolsremoving MCP tools, which leftpi --tools codemodewithout any MCP servers.--toolsnow keeps MCP tools unless an entry starts withmcp__Fixed MCP session shutdown returning while a server was still connecting, leaving its transport open until the server answered or timed out
Fixed system prompt rules and the skills hint naming tools hidden by
prepareLoadout. Hidden tools are left out of the rules, the skills hint names no tool when the file reader is hidden, andcodemodeshows each tool's prompt guidelines with its declaration;ToolLoadoutgainsgetPromptGuidelines()Fixed Bedrock requests that fail with
The pending stream has been canceledafter a stalled HTTP/2 connection not being retried automaticallyFixed codemode scripts that patch built-ins (for example
Array.prototype.toJSON = ...) crashing pi and leaving the tool call unsettled. Built-ins are now frozen before the script runs, so such patches have no effect
Dependency tracking · free for 3 projects
Know when your own dependencies move
@earendil-works/pi-durable shipped a new major in the last 12 months, among 17 releases. Inlinr shows which of your projects are behind, and what the upgrade breaks.
Advisories reach you
An email when a critical or high advisory affects a project, before the next install.
Upgrades checked first
Peer ranges, Node, ESM-only and types changes read before you bump.
Only what matters
Majors and breaking notes stay; patches and sibling bumps fold into one line.
Registry facts last checked 22 Oct 2026. Releases and advisories last read 22 Oct 2026.