| 1.2.0 |
2026-10-12 |
Published generated configuration schemas for models, settings, keybindings, and themes at https://pi.dev/schemas/*.schema.json. The theme schema moved to https://pi.dev/schemas/theme.schema.json; themes loaded during startup now receive the same schema validation as later reloads. Update theme $schema references, define reusable colors under vars, and remove unsupported metadata (#9880, #10751 by @christianklotz) |
| 1.2.0 |
2026-10-12 |
Changed before_agent_start to also fire for runs started by pi.sendMessage(..., { triggerTurn: true }) while idle. BeforeAgentStartEvent is now a union on messageType: "user" events carry prompt and images, and "custom" events carry the starting message and no prompt. Messages returned by handlers are added to both kinds of run, and pending deliverAs: "nextTurn" messages are delivered with the custom-message run. Handlers that should act only on user prompts must check event.messageType === "user" (#10267, #5581, #10739 by @davidbrai) |
| 1.2.0 |
2026-10-12 |
Changed the session to count as busy while a run starts, including during before_agent_start handlers: 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() requires deliverAs, and an abort requested meanwhile aborts the run once it starts (#10739 by @davidbrai) |
| 1.2.0 |
2026-10-12 |
Changed pi mcp list --json to report resources: true for servers that offer resources instead of resources and resourceTemplates counts; Pi no longer lists resources when connecting (#10526) |
| 1.0.3 |
2026-10-05 |
Renamed the Azure provider from azure-openai-responses to azure. Rename the provider key in auth.json (or run /login again), in models.json, and in settings.json (defaultProvider, enabledModels patterns, and modelThinkingLevels keys). Sessions that used the old provider fall back to another model when resumed, and their prompt cache is not reused. The AZURE_OPENAI_* environment variables are unchanged (#9714 by @jsanter27) |
| 0.87.0 |
2026-09-21 |
Removed the inherited shouldStopAfterTurn agent option. Use finishTurn and return { action: "end" } instead. finishTurn runs before turn_end but applies the decision afterward, and it also receives error and aborted responses; migrate normal-response predicates by returning undefined for those hard exits. See the @earendil-works/pi-agent-core changelog for a complete before-and-after example. |
| 0.87.0 |
2026-09-21 |
Added ContextEditEntry to the exported SessionEntry union. TypeScript consumers with exhaustive entry switches must handle context_edit; use replacement: null for omission and a content replacement otherwise. |
| 0.87.0 |
2026-09-21 |
Made SessionManager canonical for AgentSession provider context. Assigning session.agent.state.messages no longer replaces future request history; restore with SessionManager.inMemory(cwd, { id }, entries), navigate with session.navigateTree(), or append through session.sessionManager and call session.refreshContext(). |
| 0.87.0 |
2026-09-21 |
Expanded TurnEndEvent with required boundary fields and added AgentBeforeSettleEvent to the exported ExtensionEvent union. Consumers constructing events or exhaustively switching on ExtensionEvent must handle the new shapes. ExtensionRunner.emit() no longer accepts turn_end; host integrations dispatch actionable boundaries with emitBoundary(baseEvent, buildContext). |
| 0.87.0 |
2026-09-21 |
Deferred runs requested from agent_settled handlers until all settled handlers finish. Handlers still observe ctx.isIdle() === true, but no longer see a reentrant agent_start during the same notification dispatch. |
| 0.86.0 |
2026-09-19 |
Changed inherited pi-ai provider stream inputs from Context to normalized TranscriptContext values. Custom providers must read system prompts and tool declarations from context.messages with getCurrentSystemPrompt() and getCurrentTools(). See Custom Streaming API. |
| 0.86.0 |
2026-09-19 |
Restricted inherited ToolCall.arguments and ToolResultMessage.details to JSON-compatible values, changed ToolResultMessage into a conditional type, and made JsonValue arrays readonly. |
| 0.86.0 |
2026-09-19 |
user_bash now fails closed: errors or invalid defined results abort the command without invoking later handlers or executing locally. Return undefined to continue propagation; otherwise return { operations } or { result } (#9068). |
| 0.84.3 |
2026-08-24 |
Renamed the inherited GoogleThinkingLevel type to GoogleApiThinkingLevel and added ResolvedGoogleThinkingLevel for normalized adapter levels. |
| 0.84.0 |
2026-08-06 |
Renamed the inherited pi-ai ModelsStreamTransforms interface to ModelsRequestTransforms because its header transformation now applies to all authenticated provider requests. |
| 0.84.0 |
2026-08-06 |
Changed JSON and RPC message_update events to emit only assistantMessageEvent deltas, removing the cumulative message and assistantMessageEvent.partial fields that caused quadratic output growth. Clients that need partial messages must assemble deltas between message_start and message_end; the latter remains authoritative (#7290). |
| 0.84.0 |
2026-08-06 |
ModelRegistry.getApiKeyAndHeaders() now returns ProviderHeaders with string | null values and preserves null header-deletion markers. Extensions that inspect returned headers must handle null; extensions forwarding them to pi-ai streams should pass them through unchanged. This prevents placeholder OpenAI credentials from being sent through Cloudflare AI Gateway (#7030). |
| 0.84.0 |
2026-08-06 |
Changed ModelRegistry.refresh() to accept ModelsRefreshOptions and return ModelsRefreshResult instead of discarding cancellation and provider errors. |
| 0.84.0 |
2026-08-06 |
Changed ModelRuntime.setRuntimeApiKey() to accept auth cancellation options rather than catalog refresh options. Call refresh({ providers: [providerId], signal }) separately when remote freshness is required. |
| 0.84.0 |
2026-08-06 |
Required config-form extension OAuth refreshToken(credentials, signal) callbacks to accept and honor a concrete abort signal. |
| 0.84.0 |
2026-08-06 |
Replaced dynamic provider refresh context store access with the read-only context.stored snapshot and generation-checked context.publish() transaction. |
| 0.84.0 |
2026-08-06 |
Replaced the inherited pi-agent-core harness session model with the v4 lane-based Session, SessionStorage, and SessionRepo APIs, including durable operation records, global facts, shared sequence numbers, and tree-scoped lane views. |
| 0.84.0 |
2026-08-06 |
Promoted the inherited v2 session and AgentHarness API from pi-agent-core's experimental entrypoint to its default export and removed the experimental subpaths. |
| 0.84.0 |
2026-08-06 |
Removed the inherited legacy JSONL and in-memory repository APIs. Use pi-agent-core's v4 JsonlSessionRepo or InMemorySessionRepo, both implementing the new SessionRepo contract. |
| 0.84.0 |
2026-08-06 |
Added the inherited required pi-agent-core FileSystem.renameFile() operation for atomic JSONL publication; custom harness file-system implementations must provide same-filesystem replacement semantics (#7707 by @davidbrai). |
| 0.84.0 |
2026-08-06 |
Replaced experimental remote-session list summaries with durable SessionMetadata; RemoteSession.sessions no longer exposes runtime phase, model, thinking, attachment, or lock state, which remains available from acquired SessionSnapshot values (#7708). |
| 0.83.0 |
2026-07-29 |
Upgraded bundled TypeBox aliases to 1.3.7, removing deprecated APIs including Type.Base, Type.Awaited, Type.Promise, Type.AsyncIterator, Type.Iterator, Type.Options, and Value.Mutate, while fixing compiled validation of nullable array tool arguments. Extensions using removed APIs must migrate to supported TypeBox APIs. See Package Dependencies (#7243 by @petrroll). |
| 0.80.8 |
2026-07-16 |
Replaced the SDK's CreateAgentSessionOptions.authStorage and modelRegistry options with the async modelRuntime option. AuthStorage and its storage backends are no longer exported; use ModelRuntime (or a custom pi-ai CredentialStore), or readStoredCredential() for one-off reads of auth.json. |
| 0.80.8 |
2026-07-16 |
Removed redundant ModelRuntime.getAll(), find(), getSnapshot(), and getAuthOptions() projections. Use the pi-ai Models methods getModels(), getModel(), getProviders(), and checkAuth() directly. |
| 0.80.8 |
2026-07-16 |
Replaced SDK request-auth assembly through ModelRegistry.getApiKeyAndHeaders() with ModelRuntime.getAuth(). Passing a provider ID returns provider-scoped auth; passing a model also resolves built-in, models.json, and extension model headers. |
| 0.80.8 |
2026-07-16 |
Changed extension-facing ModelRegistry.refresh() from synchronous void to Promise<void> because models.json loading is asynchronous. Extensions must await it before making synchronous registry reads. |
| 0.80.8 |
2026-07-16 |
Moved canonical dynamic catalog refresh to async ModelRuntime.refresh()/pi-ai Models.refresh(). Legacy extension OAuth modifyModels remains supported as a synchronous compatibility projection after credential initialization. |
| 0.80.7 |
2026-07-14 |
Removed the openai-responses compat.sendSessionIdHeader flag from models.json. Session-affinity behavior is now controlled by compat.sessionAffinityFormat ("openai", "openai-nosession", or "openrouter"). Replace sendSessionIdHeader: false with sessionAffinityFormat: "openai-nosession" (#6496 by @petrroll). |
| 0.75.0 |
2026-05-17 |
Raised the minimum supported Node.js version to 22.19.0. |
| 0.73.0 |
2026-05-04 |
Switched the built-in xiaomi provider from Token Plan AMS to Xiaomi's API billing endpoint, and renamed its /login display from "Xiaomi MiMo Token Plan" to "Xiaomi MiMo". XIAOMI_API_KEY now refers to the API billing key from platform.xiaomimimo.com. Users on Token Plan should switch to the appropriate xiaomi-token-plan-* provider and set the corresponding env var (#4112 by @Phoen1xCode). |
| 0.72.0 |
2026-05-01 |
Replaced compat.reasoningEffortMap in models.json and pi.registerProvider() model definitions with model-level thinkingLevelMap (#3208). Migration: move old mappings from compat.reasoningEffortMap to thinkingLevelMap. Use string values for provider-specific thinking values and null for unsupported pi levels that should be hidden and skipped by cycling. See docs/models.md#thinking-level-map and docs/custom-provider.md. |
| 0.71.0 |
2026-04-30 |
Removed built-in Google Gemini CLI and Google Antigravity support. Existing configurations using those providers must switch to another supported provider. |
| 0.70.0 |
2026-04-23 |
Disabled OSC 9;4 terminal progress indicators by default. Set terminal.showTerminalProgress to true in /settings to re-enable (#3588) |
| 0.69.0 |
2026-04-22 |
Migrated first-party coding-agent code, SDK/examples/docs, and package metadata from @sinclair/typebox 0.34.x to typebox 1.x. New extensions, SDK integrations, and pi packages should depend on and import from typebox. Legacy extension loading still aliases the root @sinclair/typebox package, but @sinclair/typebox/compiler is no longer shimmed. This migration also picks up the new @mariozechner/pi-ai TypeBox-native validator path, so tool argument validation now works in eval-restricted runtimes such as Cloudflare Workers instead of being skipped (#3112) |
| 0.69.0 |
2026-04-22 |
Session-replacement commands now invalidate captured pre-replacement session-bound extension objects after ctx.newSession(), ctx.fork(), and ctx.switchSession(). Old pi and command ctx references now throw instead of silently targeting the replaced session. Migration: if code needs to keep working in the replacement session after one of those calls, pass withSession to that same method and do the post-switch work there. In practice, move post-switch pi.sendUserMessage(), pi.sendMessage(), and command-ctx/session-manager access into withSession, and use only the ReplacedSessionContext passed to that callback for session-bound operations. Footguns: withSession runs after the old extension instance has already received session_shutdown, old cleanup may already have invalidated captured state, captured old pi / old command ctx are stale, and previously extracted raw objects such as const sm = ctx.sessionManager remain the caller's responsibility and must not be reused after the switch. |
| 0.68.0 |
2026-04-20 |
Changed SDK and CLI tool selection from cwd-bound built-in tool instances to tool-name allowlists. createAgentSession({ tools }) now expects string[] names such as "read" and "bash" instead of Tool[], --tools now allowlists built-in, extension, and custom tools by name, and --no-tools now disables all tools by default rather than only built-ins. Migrate SDK code from tools: [readTool, bashTool] to tools: ["read", "bash"] (#2835, #3452) |
| 0.68.0 |
2026-04-20 |
Removed prebuilt cwd-bound tool and tool-definition exports from @mariozechner/pi-coding-agent, including readTool, bashTool, editTool, writeTool, grepTool, findTool, lsTool, readOnlyTools, codingTools, and the corresponding *ToolDefinition values. Use the explicit factory exports instead, for example createReadTool(cwd), createBashTool(cwd), createCodingTools(cwd), and createReadToolDefinition(cwd) (#3452) |
| 0.68.0 |
2026-04-20 |
Removed ambient process.cwd() / default agent-dir fallback behavior from public resource helpers. DefaultResourceLoader, loadProjectContextFiles(), and loadSkills() now require explicit cwd/agent-dir style inputs, and exported system-prompt option types now require an explicit cwd. Pass the session or project cwd explicitly instead of relying on process-global defaults (#3452) |
| 0.65.0 |
2026-04-03 |
Removed extension post-transition events session_switch and session_fork. Use session_start with event.reason ("startup" | "reload" | "new" | "resume" | "fork"). For "new", "resume", and "fork", session_start includes previousSessionFile. |
| 0.65.0 |
2026-04-03 |
Removed session-replacement methods from AgentSession. Use AgentSessionRuntime for newSession(), switchSession(), fork(), and importFromJsonl(). Cross-cwd session replacement rebuilds all cwd-bound runtime state and replaces the live AgentSession instance. |
| 0.65.0 |
2026-04-03 |
Removed session_directory from extension and settings APIs. |
| 0.65.0 |
2026-04-03 |
Unknown single-dash CLI flags (e.g. -s) now produce an error instead of being silently ignored. |
| 0.64.0 |
2026-03-29 |
ModelRegistry no longer has a public constructor. SDK callers and tests must use ModelRegistry.create(authStorage, modelsJsonPath?) for file-backed registries or ModelRegistry.inMemory(authStorage) for built-in-only registries. Direct new ModelRegistry(...) calls no longer compile. |
| 0.63.0 |
2026-03-27 |
ModelRegistry.getApiKey(model) has been replaced by getApiKeyAndHeaders(model) because models.json auth and header values can now resolve dynamically on every request. Extensions and SDK integrations that previously fetched only an API key must now fetch request auth per call and forward both apiKey and headers. Use getApiKeyForProvider(provider) only when you explicitly want provider-level API key lookup without model headers or authHeader handling (#1835) |
| 0.63.0 |
2026-03-27 |
Removed deprecated direct minimax and minimax-cn model IDs, keeping only MiniMax-M2.7 and MiniMax-M2.7-highspeed. Update pinned model IDs to one of those supported direct MiniMax models, or use another provider route that still exposes the older IDs (#2596 by @liyuan97) |
| 0.62.0 |
2026-03-23 |
Changed ToolDefinition.renderCall and renderResult semantics. Fallback rendering now happens only when a renderer is not defined for that slot. If renderCall or renderResult is defined, it must return a Component. |
| 0.62.0 |
2026-03-23 |
Changed slash command provenance to use sourceInfo consistently. RPC get_commands, RpcSlashCommand, and SDK SlashCommandInfo no longer expose location or path. Use sourceInfo instead (#1734) |
| 0.62.0 |
2026-03-23 |
Removed legacy source fields from Skill and PromptTemplate. Use sourceInfo.source for provenance instead (#1734) |
| 0.62.0 |
2026-03-23 |
Removed ResourceLoader.getPathMetadata(). Resource provenance is now attached directly to loaded resources via sourceInfo (#1734) |
| 0.62.0 |
2026-03-23 |
Removed extensionPath from RegisteredCommand and RegisteredTool. Use sourceInfo.path for provenance instead (#1734) |
| 0.62.0 |
2026-03-23 |
RPC get_commands: replace path and location with sourceInfo.path, sourceInfo.scope, and sourceInfo.source |
| 0.62.0 |
2026-03-23 |
SlashCommandInfo: replace command.path and command.location with command.sourceInfo |
| 0.62.0 |
2026-03-23 |
Skill and PromptTemplate: replace .source with .sourceInfo.source |
| 0.62.0 |
2026-03-23 |
RegisteredCommand and RegisteredTool: replace .extensionPath with .sourceInfo.path |
| 0.62.0 |
2026-03-23 |
Custom ResourceLoader implementations: remove getPathMetadata() and read provenance from loaded resources directly |
| 0.62.0 |
2026-03-23 |
command.path -> command.sourceInfo.path |
| 0.62.0 |
2026-03-23 |
command.location === "user" -> command.sourceInfo.scope === "user" |
| 0.62.0 |
2026-03-23 |
skill.source -> skill.sourceInfo.source |
| 0.62.0 |
2026-03-23 |
tool.extensionPath -> tool.sourceInfo.path |
| 0.61.0 |
2026-03-20 |
Interactive keybinding ids are now namespaced, and keybindings.json now uses those same canonical namespaced ids. Older config files are migrated automatically on startup. Custom editors and extension UI components still receive an injected keybindings: KeybindingsManager. They do not call getKeybindings() or setKeybindings() themselves. Declaration merging applies to that injected type (#2391) |
| 0.61.0 |
2026-03-20 |
Extension author migration: update keyHint(), keyText(), and injected keybindings.matches(...) calls from old built-in names like "expandTools", "selectConfirm", and "interrupt" to namespaced ids like "app.tools.expand", "tui.select.confirm", and "app.interrupt". See docs/keybindings.md for the full list. pi.registerShortcut("ctrl+shift+p", ...) is unchanged because extension shortcuts still use raw key combos, not keybinding ids. |
| 0.60.0 |
2026-03-18 |
Changed package startup behavior so installed unpinned packages are no longer checked or updated during startup. Use pi update to apply npm/git package updates, while interactive mode now checks for available package updates in the background and notifies you when updates are available (#1963) |
| 0.59.0 |
2026-03-17 |
Changed custom tool system prompt behavior so extension and SDK tools are included in the default Available tools section only when they provide promptSnippet. Omitting promptSnippet now leaves the tool out of that section instead of falling back to description (#2285) |
| 0.57.0 |
2026-03-07 |
RPC mode now uses strict LF-delimited JSONL framing. Clients must split records on \n only instead of using generic line readers such as Node readline, which also split on Unicode separators inside JSON payloads (#1911) |
| 0.56.0 |
2026-03-04 |
Changed scoped model thinking semantics. Scoped entries without an explicit :<thinking> suffix now inherit the current session thinking level when selected, instead of applying a startup-captured default. |
| 0.56.0 |
2026-03-04 |
Moved Node OAuth runtime exports off the top-level @mariozechner/pi-ai entry. OAuth login and refresh must be imported from @mariozechner/pi-ai/oauth (#1814). |
| 0.55.0 |
2026-02-24 |
Resource precedence for extensions, skills, prompts, themes, and slash-command name collisions is now project-first (cwd/.pi) before user-global (~/.pi/agent). If you relied on global resources overriding project resources with the same names, rename or reorder your resources. |
| 0.55.0 |
2026-02-24 |
Extension registration conflicts no longer unload the entire later extension. All extensions stay loaded, and conflicting command/tool/flag names are resolved by first registration in load order. |
| 0.53.0 |
2026-02-17 |
SettingsManager persistence semantics changed for SDK consumers. Setters now update in-memory state immediately and queue disk writes. Code that requires durable on-disk settings must call await settingsManager.flush(). |
| 0.53.0 |
2026-02-17 |
AuthStorage constructor is no longer public. Use static factories (AuthStorage.create(...), AuthStorage.fromStorage(...), AuthStorage.inMemory(...)). This breaks code that used new AuthStorage(...) directly. |
| 0.52.10 |
2026-02-12 |
ContextUsage.tokens and ContextUsage.percent are now number | null. After compaction, context token count is unknown until the next LLM response, so these fields return null. Extensions that read ContextUsage must handle the null case. Removed usageTokens, trailingTokens, and lastUsageIndex fields from ContextUsage (implementation details that should not have been public) (#1382 by @ferologics) |
| 0.52.10 |
2026-02-12 |
Git source parsing is now strict without git: prefix: only protocol URLs are treated as git (https://, http://, ssh://, git://). Shorthand sources like github.com/org/repo and git@github.com:org/repo now require the git: prefix. (#1426) |
| 0.52.7 |
2026-02-06 |
Changed models.json provider models behavior from full replacement to merge-by-id with built-in models. Built-in models are now kept by default, and custom models upsert by id. |
| 0.52.6 |
2026-02-05 |
Removed /exit command handling. Use /quit to exit (#1303) |
| 0.51.3 |
2026-02-03 |
RPC get_commands response and SlashCommandSource type: renamed "template" to "prompt" for consistency with the rest of the codebase |
| 0.51.0 |
2026-02-01 |
Extension tool signature change: ToolDefinition.execute now uses (toolCallId, params, signal, onUpdate, ctx) parameter order to match AgentTool.execute. Previously it was (toolCallId, params, onUpdate, ctx, signal). This makes wrapping built-in tools trivial since the first four parameters now align. Update your extensions by swapping the signal and onUpdate parameters: |
| 0.50.0 |
2026-01-26 |
Header values in models.json now resolve environment variables (if a header value matches an env var name, the env var value is used). This may change behavior if a literal header value accidentally matches an env var name. (#909) |
| 0.50.0 |
2026-01-26 |
External packages (npm/git) are now configured via packages array in settings.json instead of extensions. Existing npm:/git: entries in extensions are auto-migrated. (#645) |
| 0.50.0 |
2026-01-26 |
Resource loading now uses ResourceLoader only and settings.json uses arrays for extensions, skills, prompts, and themes (#645) |
| 0.50.0 |
2026-01-26 |
Removed discoverAuthStorage and discoverModels from the SDK. AuthStorage and ModelRegistry now default to ~/.pi/agent paths unless you pass an agentDir (#645) |
| 0.47.0 |
2026-01-16 |
Extensions using Editor directly must now pass TUI as the first constructor argument: new Editor(tui, theme). The tui parameter is available in extension factory functions. (#732) |
| 0.44.0 |
2026-01-12 |
pi.getAllTools() now returns ToolInfo[] (with name and description) instead of string[]. Extensions that only need names can use .map(t => t.name). (#648 by @carsonfarmer) |
| 0.43.0 |
2026-01-11 |
Extension editor (ctx.ui.editor()) now uses Enter to submit and Shift+Enter for newlines, matching the main editor. Previously used Ctrl+Enter to submit. Extensions with hardcoded "ctrl+enter" hints need updating. (#642 by @mitsuhiko) |
| 0.43.0 |
2026-01-11 |
Renamed /branch command to /fork (#641) |
| 0.43.0 |
2026-01-11 |
SessionManager.list() and SessionManager.listAll() are now async, returning Promise<SessionInfo[]>. Callers must await them. (#620 by @tmustier) |
| 0.39.0 |
2026-01-08 |
before_agent_start event now receives systemPrompt in the event object and returns systemPrompt (full replacement) instead of systemPromptAppend. Extensions that were appending must now use event.systemPrompt + extra pattern. (#575) |
| 0.39.0 |
2026-01-08 |
discoverSkills() now returns { skills: Skill[], warnings: SkillWarning[] } instead of Skill[]. This allows callers to handle skill loading warnings. (#577 by @cv) |
| 0.38.0 |
2026-01-08 |
ctx.ui.custom() factory signature changed from (tui, theme, done) to (tui, theme, keybindings, done) for keybinding access in custom components |
| 0.38.0 |
2026-01-08 |
LoadedExtension type renamed to Extension |
| 0.38.0 |
2026-01-08 |
LoadExtensionsResult.setUIContext() removed, replaced with runtime: ExtensionRuntime |
| 0.38.0 |
2026-01-08 |
ExtensionRunner constructor now requires runtime: ExtensionRuntime as second parameter |
| 0.38.0 |
2026-01-08 |
ExtensionRunner.initialize() signature changed from options object to positional params (actions, contextActions, commandContextActions?, uiContext?) |
| 0.38.0 |
2026-01-08 |
ExtensionRunner.getHasUI() renamed to hasUI() |
| 0.38.0 |
2026-01-08 |
OpenAI Codex model aliases removed (gpt-5, gpt-5-mini, gpt-5-nano, codex-mini-latest). Use canonical IDs: gpt-5.1, gpt-5.1-codex-mini, gpt-5.2, gpt-5.2-codex. (#536 by @ghoulr) |
| 0.35.0 |
2026-01-05 |
Settings: hooks and customTools arrays replaced with single extensions array |
| 0.35.0 |
2026-01-05 |
CLI: --hook and --tool flags replaced with --extension / -e |
| 0.35.0 |
2026-01-05 |
Directories: hooks/, tools/ → extensions/; commands/ → prompts/ |
| 0.35.0 |
2026-01-05 |
Types: See type renames above |
| 0.35.0 |
2026-01-05 |
SDK: See SDK migration above |
| 0.33.0 |
2026-01-04 |
Key detection functions removed from @mariozechner/pi-tui: All isXxx() key detection functions (isEnter(), isEscape(), isCtrlC(), etc.) have been removed. Use matchesKey(data, keyId) instead (e.g., matchesKey(data, "enter"), matchesKey(data, "ctrl+c")). This affects hooks and custom tools that use ctx.ui.custom() with keyboard input handling. (#405) |
| 0.32.0 |
2026-01-03 |
Queue API replaced with steer/followUp: The queueMessage() method has been split into two methods with different delivery semantics (#403): |
| 0.32.0 |
2026-01-03 |
Settings renamed: queueMode setting renamed to steeringMode. Added new followUpMode setting. Old settings.json files are migrated automatically. |
| 0.32.0 |
2026-01-03 |
AgentSession methods renamed: |
| 0.32.0 |
2026-01-03 |
Hook API signature changed: pi.sendMessage() second parameter changed from triggerTurn?: boolean to options?: { triggerTurn?, deliverAs? }. Use deliverAs: "followUp" for follow-up delivery. Affects both hooks and internal sendHookMessage() method. |
| 0.32.0 |
2026-01-03 |
RPC API changes: |
| 0.32.0 |
2026-01-03 |
Settings UI: "Queue mode" setting split into "Steering mode" and "Follow-up mode" |
| 0.30.0 |
2025-12-25 |
SessionManager API: The second parameter of create(), continueRecent(), and list() changed from agentDir to sessionDir. When provided, it specifies the session directory directly (no cwd encoding). When omitted, uses default (~/.pi/agent/sessions/<encoded-cwd>/). open() no longer takes agentDir. (#313) |
| 0.29.0 |
2025-12-25 |
Renamed /clear to /new: The command to start a fresh session is now /new. Hook event reasons before_clear/clear are now before_new/new. Merry Christmas @mitsuhiko! (#305) |
| 0.27.0 |
2025-12-22 |
Session hooks API redesign: Merged branch event into session event. BranchEvent, BranchEventResult types and pi.on("branch", ...) removed. Use pi.on("session", ...) with reason: "before_branch" | "branch" instead. AgentSession.branch() returns { cancelled } instead of { skipped }. AgentSession.reset() and switchSession() now return boolean (false if cancelled by hook). RPC commands reset, switch_session, and branch now include cancelled in response data. (#278) |
| 0.24.0 |
2025-12-19 |
Custom tools now require index.ts entry point: Auto-discovered custom tools must be in a subdirectory with an index.ts file. The old pattern ~/.pi/agent/tools/mytool.ts must become ~/.pi/agent/tools/mytool/index.ts. This allows multi-file tools to import helper modules. Explicit paths via --tool or settings.json still work with any .ts file. |
| 0.24.0 |
2025-12-19 |
Hook tool_result event restructured: The ToolResultEvent now exposes full tool result data instead of just text. (#233) |
| 0.23.3 |
2025-12-17 |
Hooks: turn_end event's toolResults type changed from AppMessage[] to ToolResultMessage[]. If you have hooks that handle turn_end events and explicitly type the results, update your type annotations. |
| 0.23.0 |
2025-12-17 |
Hooks: Replaced session_start and session_switch events with unified session event. Use event.reason ("start" | "switch" | "clear") to distinguish. Event now includes entries array for state reconstruction. |
| 0.20.0 |
2025-12-13 |
Pi skills now use SKILL.md convention: Pi skills must now be named SKILL.md inside a directory, matching Codex CLI format. Previously any *.md file was treated as a skill. Migrate by renaming ~/.pi/agent/skills/foo.md to ~/.pi/agent/skills/foo/SKILL.md. |
| 0.16.0 |
2025-12-09 |
New RPC protocol: The RPC mode (--mode rpc) has been completely redesigned with a new JSON protocol. The old protocol is no longer supported. See C1 for the new protocol documentation and C2 for a working example. Includes RpcClient TypeScript class for easy integration. (#91) |
| 0.14.0 |
2025-12-08 |
Custom themes require new color tokens: Themes must now include thinkingXhigh and bashMode color tokens. The theme loader provides helpful error messages listing missing tokens. See built-in themes (dark.json, light.json) for reference values. |