npm / @earendil-works/pi-coding-agent
@earendil-works/pi-coding-agent
What changed in @earendil-works/pi-coding-agent 0.78 to 1, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-19.
25 breaking5 security14 new APIs and options1 performance7 behavior and defaults3 tooling45 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli init@earendil-works/pi-coding-agent 196 changes
Breaking changes 25
The unsupported off thinking level is no longer offered.
Uses OpenAI Chat Completions at the Kimi coding endpoint; models.json base URL overrides must include /v1.
Pi's Node.js is now only a fallback on PATH, so bash tool shells use the user's node/npm.
Moved to the opencode.ai/inference endpoints; OpenCode Go also gains Google Generative AI support.
Malformed final JSON arguments now fail validation and show the model the raw arguments instead of silently running with partial fields.
The models now expose only the off and high thinking levels, avoiding 400 errors at minimal.
An abort requested while a run is starting now aborts the run once it starts.
The event also fires for idle runs started with
pi.sendMessage(..., { triggerTurn: true }); handlers receive a user or custom event, and handlers limited to prompts must checkevent.messageType === "user".The event is now a union: user events carry
promptandimages, while custom events carry the startingmessageand noprompt.The unpublished experimental
./clientexport was removed.Returns false while a run is starting, including during
before_agent_starthandlers.The package used by the unreleased experimental stack was removed and is no longer released.
The package used by the unreleased experimental stack was removed and is no longer released.
The package used by the unreleased experimental stack was removed and is no longer released.
The unpublished experimental
./experimental/pluginexport was removed.OAuth sign-in now fails with an issuer mismatch when an authorization response includes an
issparameter that cannot be checked because server metadata was not discovered.A
// @options:line that is not the first script line now causes an error before execution instead of being silently ignored, preventing runs without the requested timeout.Print mode now prints partial text, warns on stderr, and exits 1 when the final response is cut off at the model's output token limit.
The JSON output reports
resources: truefor servers offering resources instead of resource and resource-template counts.When a run is starting, the session counts as busy and
pi.sendMessage()queues into that run instead of trying to start a second run.Calls made while a run is starting now require
deliverAs.MCP tool calls now handle structured content that is an array, null, or primitive; codemode types it as
unknownwhen no output schema is declared.The theme schema URL changed, and themes loaded at startup now receive the same schema validation as themes reloaded later.
The timeout now limits the whole sign-in, including requests to the authorization server, rather than only the wait for the browser.
Julia-1, Laya, Kev, lev, and OpenJev served by llama.cpp 0.6.0 or later run natively as classifiers rather than chat models.
Security 1
Models disabled by an organization owner are no longer listed.
New APIs and options 14
Choose automatic, GitHub gist, or Radius uploads for /share.
Tool namespaces can define aliases, which codemode namespace descriptions and
searchTools()namespace matching recognize; MCP namespaces use the server name.Pi lists only chat models available to the configured OpenRouter key, with that key's model limits and prices, and saves the list for offline use.
Setting
PI_CLIPBOARD_OSC52=1sends copied text to the terminal after the local clipboard write, enabling copies to reach remote clients when Pi cannot detect the remote session.Tool definitions can declare which other tools a call may reach, allowing the MCP extension to wait for needed servers and determine whether replacement tools can reach MCP tools.
Published schemas for settings, models, keybindings, and themes can be referenced from configuration files for editor validation and completion.
agent_settled session, extension, and JSON events include aborted so integrations can distinguish a cancelled run from a finished one.
Claude Haiku 5.5 is available with adaptive thinking up to xhigh/max effort and prompt caching on Bedrock.
OpenAI's GPT-6 Luna is available as a classifier model through the Decisions API.
Tool render context and tool_execution_end extension events include the recorded execution time of a final tool result.
The codemode classification context accepts images for classifiers that support them.
Pi reports whether it is working, blocked on a dialog or login, done, or failed to terminals and dashboards that support OSC 7501.
Overrides detection of program status reporting with a value of 1 or 0.
Entries such as +codemode and -write adjust the default tool selection instead of replacing it.
Performance 1
Joining output items is no longer quadratic, preventing long process-blocking delays for scripts with many
text()calls.
Behavior and default changes 7
K3, K3-256K, and Kimi For Coding accept tools added mid-conversation without invalidating the prompt cache.
Thinking blocks from earlier assistant messages produced by another model are dropped instead of being sent as plain text.
Changing the thinking level mid-session with an API key keeps the prompt cache.
Conversation serialization for compaction, branch summaries, and bug reports omits thinking blocks to avoid oversized summarization requests.
When enabled, the setting uses only the terminal cursor instead of also drawing Pi's reverse-video cursor.
Reusable theme colors should be defined under
varswhen updating themes for the published schema.The tool render context includes outputPad, which now also applies to ! command output, tool output, and summary blocks.
Tooling 3
Tool declarations expose input constraints as
@tags on property comments, so scripts can see constraints without repeating them in descriptions.Codemode tool rows show elapsed time while a script runs and total time when it finishes.
Codemode declarations spell out MCP result fields instead of referring to an undefined
CallToolResult<T>type, and no longer include shared MCP types.
Fixes and other changes 45
Requests with images in an error tool result no longer fail with a 400; images are sent after the turn's tool results.
Retries now trigger for gateway upstream-stream forwarding errors and temporary service-unavailable errors.
Stopping a script or reaching its deadline no longer waits for a non-interruptible built-in to return on Bun.
Live workers are limited to two across sessions, with cancelled workers counted until they exit.
Calling done() on a custom overlay closes that overlay rather than the topmost overlay.
Adds a model for each provider that offers it and warns when the match is ambiguous.
Vertex requests no longer fail with an unsupported thinking-budget error, and the thinking level is honored on the Gemini API.
When several providers offer a model match, Pi prefers the provider with credentials and otherwise reports the ambiguity.
Adds a model for each provider that offers it and warns when the match is ambiguous.
Uses a 500K context window instead of 272K.
Thinking no longer appears after the answer when a proxy sends reasoning and content in the same stream chunk.
Uses the Anthropic Messages API for MiniMax M2.7, fixing the unsupported protocol error.
Empty quoted arguments are preserved, so later positional arguments are not shifted and positional defaults can apply.
Fixed labels for numeric-string or null arguments in the TUI, session tree, and HTML exports.
Resume restores the session's active tools, with --tools +name/-name entries applied on top unless tool selection is explicit.
Parsing no longer drops fields when a string contains an invalid Unicode escape.
A symlinked
AGENTS.mdin a git worktree nested inside its main repository no longer prevents project context from loading.When Anthropic rejects strict tools due to grammar size, tool count, or union limits, Pi retries once with preferred tools non-strict.
On Windows, Pi briefly retries reads or writes when a previous lock folder is still being deleted, rather than failing immediately with
EPERM.Codemode no longer fails with a broken bridge when Pi runs under
node --watchon Node 24 or 26.Tilde expansion now works in
!pattern,+path, and-pathentries for the extensions, skills, prompts, and themes settings.Pi no longer lists resources while connecting, so servers with resources can register tools without waiting for resource enumeration.
Cancelled or timed-out MCP calls waiting for an OAuth refresh are no longer sent to the server after the refresh finishes.
The request timeout now applies only while waiting for response headers, preventing streams from being aborted mid-generation.
Negative placeholder prices from OpenRouter are treated as zero, avoiding extreme negative cost displays for router models.
The timeout limits the entire sign-in, not only the wait for the browser.
Runs started with
pi.sendMessage(..., { triggerTurn: true })no longer remove sections added bybefore_agent_startafter the first tool call.A tool declaring an output schema resolves with its value on failure too, rather than rejecting every failed tool call.
“The upstream provider returned an error” is now retried as a transient provider error.
Login falls back to a free loopback port when port 53692 is reserved or in use.
Clipboard paste works in Termux, and failed copies include the Termux:API install hint.
Text outputs are separated with numbered markers, and console calls appear after other output in one block with one line per call.
Input is estimated at 3.5 characters per token instead of 4 when calculating output limits, reducing context-limit request failures.
Standalone binaries load .env, .env.local, and .env.development from the launch directory into Pi's environment.
Mistral responses ending with finish_reason: error are retried.
The manager opens without waiting for all servers to connect and remains usable while servers are enabled, reconnected, or disabled.
Sign-ins can be cancelled with Esc at every step, session shutdown aborts a running sign-in, and authorization-server requests time out after 15 seconds.
Model headers now override the originator and User-Agent headers of Codex requests.
Images are no longer dropped as “could not be resized” on Node 24.19+ and 26.x because of Node messages on the image resize worker channel.
Bedrock OpenAI models now honor the configured thinking level instead of always using Bedrock's default reasoning effort.
Managed installs now keep only the new release and the release it updated from.
The codemode description now marks searchTools(), describeTool(), and describeNamespace() as async, preventing models from serializing unawaited promises as {}.
Provider busy errors are retried rather than ending the turn.
Costs no longer undercount long prompts on models with prompt-length pricing tiers across the listed providers.
Bash and PowerShell results retain Took after session reloads, and live results show recorded execution time instead of wall-clock steps.
@earendil-works/pi-coding-agent 0.791 changes
Security 1
Pi Agent: Pi loads project-local extensions without approval
@earendil-works/pi-coding-agent 0.783 changes
Security 3
Pi Agent: Potential XSS in HTML session exports via Markdown URL sanitization bypass
Pi Agent: Predictable temporary extension install paths allow local privilege escalation on shared Linux hosts
Pi Agent: Race condition in Pi auth.json writes could expose stored credentials