@oh-my-pi/pi-agent-core
Breaking Changes
- Changed
transformProviderContextandbuildSideRequestContextto return a Promise
Added
- Added
buildSideRequestContextto theAgentclass to build prompt-cache-friendly provider Contexts for side-channels or ephemeral requests. - Added
compactionContextTokens(providerContextTokens, storedConversationEstimate): floors the provider-reported context tokens by a local estimate of the stored conversation for the compaction decision, so abefore_provider_requestpayload transform (a compression extension, obfuscator, or inline snapcompact) that shrinks the request can no longer deflate provider usage below the true history size and suppress auto-compaction.
Changed
- Exported helper functions
normalizeMessagesForProviderandresolveOwnedDialectFromEnvfrompackages/agent/src/agent-loop.ts.
@oh-my-pi/pi-ai
Changed
- Changed OpenAI Responses and Codex Responses custom grammar tool requests to leave
parallel_tool_callsunset instead of forcing serial tool calls; CodexresponsesLitestill disables parallel tool calls when tools are present.
Fixed
- Fixed Bedrock
/btwand other no-tool ephemeral turns failing after prior tool calls by sending the required sentineltoolConfigwhenever replayed history containstoolUse/toolResultblocks. (#3124) - Fixed Anthropic Messages pre-content TLS
bad record MACserver transport errors surfacing before the provider retry loop exhausts its budget. (#3134) - Fixed API-key login flows replacing existing stored keys for the same provider, so providers such as NVIDIA NIM can keep multiple active keys available for session-level rotation. (#2923)
- Fixed
openai-codex-responsesforwarding sampling controls (temperature,top_p,top_k,min_p,presence_penalty,repetition_penalty) into the Codex request body — the ChatGPT-subscription Codex backend rejects each of them with a 400{"detail":"Unsupported parameter: temperature"}, so any caller setting non-defaultStreamOptionssaw every turn fail. The provider now drops the full sampling set (matching codex-rs), and the auth-gateway's defensive strip on bothbuildStreamOptionsand the pi-native path was widened from{temperature, topP}to the same set plusstopSequences/frequencyPenalty. (#3117) - Fixed Anthropic Messages retry classification for transient TLS/server-error failures such as
tls: bad record MAC (type=server_error). These pre-content transport blips are now retried inside the provider loop before the session sees an error banner.
@oh-my-pi/pi-catalog
Fixed
- Fixed Fireworks-hosted Qwen turns (e.g.
fireworks/qwen3.7-plus) failing with400 Extra inputs are not permitted, field: 'enable_thinking'. Fireworks serves Qwen3 with controllable thinking via OpenAI-stylereasoning_effortand rejects the top-levelenable_thinkingboolean that Alibaba DashScope speaks;buildOpenAICompatwas selectingthinkingFormat: "qwen"from theqwenid pattern regardless of host. Fireworks-hosted Qwen models now resolve tothinkingFormat: "openai". - Fixed MiMo models on OpenAI-compatible gateways to expose only accepted
low,medium, andhighreasoning tiers and map unsupported rawminimal/xhighrequests to safe wire values. (#2864)
@oh-my-pi/pi-coding-agent
Added
- Added "Prose Only Thinking" setting to opt-out of rendering code blocks within AI thinking traces
- Replaced code blocks in AI thinking traces with an ellipsis when "Prose Only Thinking" is enabled
- Added a live tokens-per-second readout to the thinking pulse, counting only provider-reported tokens (no character estimate, which undercounts a summarized reasoning trace) and hiding itself whenever the rate is zero. Live numbers therefore appear only for providers that report usage mid-turn; otherwise the bare pulse keeps signalling that the model is thinking.
- Updated the thinking pulse to a faster starburst whose rotation eases across each cycle (instead of ticking at a fixed rate), with a speed badge that fades from gray to the theme accent as the rate climbs.
- Added live state previews for high-value built-in slash commands in TUI autocomplete.
- Added a copy affordance for completed
/btwanswers so users can copy the visible side-answer text before branching or dismissing the panel.
Changed
- Updated
SnapcompactInlineand SDK session context building to support asynchronous rendering - Changed side-channel turns (
/btw,/omfg, and IRC auto-replies) to forward the main turn's tool catalog to preserve the prompt-cache layout, while injecting a reminder to suppress tool usage and discarding any generated tool calls. - Changed
/btw,/tan,/omfg,/memory,/rename, and/moveto save the typed command text to TUI prompt history so they can be recalled with the up arrow. - Changed the temporary model picker to label Alt+P selections as session-only and point users to Alt+M or
/modelfor role model assignment. (#2952) - Replaced
new Promise((resolve, reject) => ...)inAsyncDrainwithPromise.withResolvers()per the repo's promise-construction convention - Changed the default advisor interrupt cooldown to 3 turns and the default auto-compaction strategy to snapcompact, with non-vision and over-budget snapcompact runs still falling back to context-full summaries.
Fixed
- Fixed a TypeError in
EventControllertests where a missingsettingsproperty in theInteractiveModeContextmock object led to calling.geton undefined when streaming tool-call args. - Fixed auto-compaction status text to label snapcompact runs instead of reporting them as context-full maintenance.
- Fixed side-channel turns failing to correctly obfuscate secrets and tools when inheriting prompt cache layout
- Fixed MCP startup status to live-update from "Connecting…" to connected, still-connecting, or failed server states so completed connections do not leave a stale banner. (#3150)
- Fixed session history becoming desynchronized when using the
rewindtool - Fixed
rewindtool output and temporary assistant side-channel data polluting the prompt cache - Fixed
readagainst a SQLite table with many columns (e.g. 33) rendering every cell as an ellipsis and chopping the right edge. The ASCII table shrinker bottomed out atMIN_COLUMN_WIDTH=1so every multi-char cell collapsed to…, and the final line truncation then cut off the right side. The renderer now bumps the per-column floor to 3 and falls back to a verticalcolumn: valueblock layout per row when the column count exceeds the horizontal width budget. (#3107) - Fixed
skill://,local://,memory://, andvault://directory paths so read lists them and search/find can walk their backing directories. (#3116) - Fixed local tiny-model inference failures respawning
__omp_worker_tiny_inferencefor the same failed model, and blocked the unsupported Qwen3 1.7B ONNX memory model before load. (#3132) - Fixed
/joinfailing withtimed out waiting for the host's welcomeon collab sessions whose existing transcript was more than a few MB. The host now sends a smallwelcomeframe (header + state + agents +entryCount) followed by a train ofsnapshot-chunkframes (SNAPSHOT_CHUNK_BYTES = 512 KB), and the guest accumulates them under a per-chunk progress timeout that resets on each chunk arrival. The first welcome lands well under one second on the default relay, so the guest's 30s first-welcome budget is no longer spent transferring the snapshot. Requires the newCOLLAB_PROTO = 2on both sides; older hosts/guests are rejected with the existing protocol-mismatch error. (#3144) - Stopped Mnemopi retention from overflowing the embedding model's context window:
embed()now caps each input atMNEMOPI_EMBEDDING_MAX_INPUT_CHARS(default 8192 chars) and clips with a head/tail split so a long multi-turnMnemopiSessionState.retainMessagestranscript can't make llama.cpp's/embeddingsserver reject the request withrequest (N tokens) exceeds the available context sizeand silently drop vector recall for that memory. The head/tail clip keeps both the opening setup and the most recent turns so later episodes don't collapse onto the same prefix vector (#3126). - Fixed
/goalcontinuation turns that end with a successfulyieldskipping threshold auto-compaction while the active goal remains overcompaction.thresholdTokens. (#3146) - Fixed first-turn memory recall invalidating append-only prompt caches by promoting injected memory into the stable session prompt before the next turn. (#3111)
/resumeandomp --resumeno longer auto-switch to the "all projects" picker when the current folder has no sessions. The picker now stays scoped to the cwd and surfaces the existing "No sessions in current folder. Press Tab to view all." hint, so users in an empty project never see other projects' session history without asking. (#3099)- Fixed
/todo exportand/todo importin ACP/text and TUI modes to resolve paths from the active session cwd, accept quoted paths with spaces, and report invalid path schemes without crashing. - Fixed the SDK
buildSystemPrompthelper to render caller-provided tools instead of falling back to the default prompt inventory, and to keep no-tools-map skills visible whenreadis available through the fallback. - Fixed Esc in focused subagent views cancelling active context maintenance (compaction, handoff, and retry operations); pressing Esc now returns to the main view instead, without aborting the maintenance. The active auto-compaction and auto-retry loaders also suppress their "(esc to cancel)" hint while focused to avoid displaying a false affordance. (#2819)
- Fixed
/omfgsaved-state copy to advertiseEsc dismissafter saving and registering the rule live. - Fixed legacy Pi extensions importing
getModel/getModelsfrom the@oh-my-pi/pi-aipackage root failing to load, by restoring them as compatibility aliases for@oh-my-pi/pi-catalog'sgetBundledModel/getBundledModels. The rootStringEnumcompatibility shim also accepts TypeScript enum objects in addition to value arrays (#2907). - Fixed the Alt+M model-configuration menu so role assignment remains selectable for models whose context window is smaller than the current session; the context-size disabling still applies to the Alt+P temporary active-model switch (#2861).
- Fixed the advisor raising false
blockers in plan mode (e.g. "don't write a plan file") because it only saw a 120-char truncation of the injected plan-mode rules, which cut off atNEVER create, edit, or delete files — excep…and hid the "except the single plan file" carve-out. The advisor delta now expands the primary agent's constraint context (plan-mode-context,plan-mode-reference) verbatim inside an XML-escaped<primary-context>wrapper instead of a one-liner, andAdvisorRuntimededupes the re-injected prompts so an unchanged copy collapses to a marker rather than re-feeding the full rules every turn. - Fixed auto-compaction being suppressed when a
before_provider_requestextension shrinks the outgoing request below the real stored conversation (e.g. a context-compression proxy such as Headroom, or an aggressive obfuscator). The provider then reports deflated prompt tokens, so the threshold check never fired and the stored history grew unbounded until it overflowed the context window and could no longer be compacted at all. The compaction decision (both the pre-prompt and post-response paths) now floors the provider-reported context tokens by the agent's own local estimate of the stored conversation, so on-wire compression can no longer hide a too-large history from the auto-compactor. Context display and cost accounting still use the exact provider usage; only the compaction trigger takes the floor. - Fixed mnemopi proactive linking being configurable only through the
MNEMOPI_PROACTIVE_LINKINGenvironment variable, unlike the siblingmnemopi.polyphonicRecall/mnemopi.enhancedRecallsettings: added amnemopi.proactiveLinkingconfig.yml setting (off by default,/settings→ Memory → Mnemopi) that ingests new memories into the episodic graph as they are stored, linking them to related entities and memories;MNEMOPI_PROACTIVE_LINKINGstill overrides the configured value when set (#2440).
@oh-my-pi/collab-web
Breaking Changes
- Bumped
COLLAB_PROTOto2: thewelcomeframe now carries metadata only (header/state/agents/entryCount) and the transcript follows in a train of targetedsnapshot-chunkframes terminated byfinal: true. Old guests speaking proto v1 are rejected with the existing protocol-mismatch error.
Changed
- Restyled the collab shell with the stats dashboard theme tokens and added the persisted system/light/dark theme toggle.
Fixed
- Fixed the guest hanging in the "waiting" phase on large host sessions: the client now accumulates
snapshot-chunkframes into the transcript snapshot and only transitions toliveafter the final chunk lands (or immediately when the host's snapshot is empty). (#3144)
@oh-my-pi/hashline
Fixed
- Fixed multi-hunk delimiter-balance repair so a
SWAPthat drops a structural closer no longer keeps it when another hunk already removed the matching opener (a deliberate wrapper removal); the missing-closer repair now weighs each group against the whole patch's residual delimiter balance — summed per hunk so quote/comment state never bleeds across non-contiguous hunks — and consumes that residual per repair so a genuine missing closer elsewhere still fires. (#3142)
@oh-my-pi/pi-mnemopi
Fixed
- Capped per-input length in
embed()atMNEMOPI_EMBEDDING_MAX_INPUT_CHARS(default 8192 chars, override via the env var orembeddings.maxInputCharsruntime option;0disables) so a long retention transcript can no longer overflow the embedding model's context window. Oversized inputs are clipped with a head/tail split so chronological transcripts keep both the opening setup and the most recent turns instead of losing the latest content under a naive prefix slice. llama.cpp's/embeddingsserver used to reject the request withrequest (N tokens) exceeds the available context size, silently dropping vector recall for that memory (#3126). - Fixed the proactive-linking write path ignoring host configuration:
proactiveLinkIfEnabledreadMNEMOPI_PROACTIVE_LINKINGdirectly, so a host that enabled proactive linking throughconfigureRecallFeatures()had no effect unless the environment variable was also set.proactiveLinkingis now aRecallFeatureFlagsoption resolved through aproactiveLinkingEnabled()fallback, matching the existing polyphonic and enhanced recall flags, with theMNEMOPI_PROACTIVE_LINKINGenvironment variable still taking precedence whenever it is set. (#2440)
@oh-my-pi/pi-natives
Breaking Changes
- Changed renderSnapcompactPng to return a promise instead of a string value
Fixed
- Fixed directory
grepcontinuing to walk large trees after the requested content match budget had already been satisfied, which could make broad coding-agent searches time out before returning the first page of matches (#2738).
@oh-my-pi/snapcompact
Breaking Changes
- Changed core rendering functions
renderandrenderManyto be asynchronous
@oh-my-pi/pi-tui
Added
- Added an optional synchronous dynamic description hook for slash-command autocomplete items.
Fixed
- Fixed Markdown component to strip inline
<span>and<text>tags while preserving their contents and unescaping nested HTML entities (<,>,",',&), preventing raw LLM block/inline formatting residues from leaking into rendered TUI output.
@oh-my-pi/pi-utils
Added
- Exported
removeSyncWithRetries()as a standalone function so tests that manage their own temp dirs can use the same retry-on-EBUSY cleanup logic asTempDir.removeSync().
@oh-my-pi/pi-wire
Breaking Changes
- Bumped
COLLAB_PROTOto2. Thewelcomehost frame now carries metadata only (header,state,agents,entryCount, optionalreadOnly) — the transcript moves to a newsnapshot-chunkhost frame ({ entries: SessionEntry[]; final: boolean }) sent immediately after the welcome. Hosts split large snapshots into multiple chunks; the last chunk carriesfinal: true. Old guests speaking proto v1 are rejected with the existing protocol-mismatch error. (#3144)
What's Changed
- fix(natives): stop broad grep after match budget by @roboomp in #2747
- fix(tui): keep Alt+M role models selectable over context limit by @roboomp in #2862
- fix(coding-agent): support bare typebox and getModel/StringEnum in legacy extensions by @pidevxplay in #2907
- fix(coding-agent): show omfg dismiss hint by @wolfiesch in #2946
- fix(catalog): clamp MiMo reasoning efforts by @riverpilot in #2994
- fix(coding-agent): clarify temporary model picker by @riverpilot in #2995
- fix(coding-agent): handle todo paths and prompt inventory by @oldschoola in #3017
- fix(ai): preserve API keys on login by @danzaio in #3081
- fix(test): use TempDir for Windows-safe cleanup in settings-manager tests by @oldschoola in #3086
- fix(test): migrate fs.rmSync to removeSyncWithRetries for EBUSY-safe cleanup by @oldschoola in #3089
- fix(coding-agent): kept /resume picker scoped to the current folder by @roboomp in #3100
- fix(read): render wide SQLite tables as vertical blocks by @roboomp in #3109
- fix(agent): preserve memory recall in append-only prompt cache by @roboomp in #3113
- fix(tool): resolve internal URL directories by @roboomp in #3118
- fix(ai): strip unsupported sampling keys from openai-codex-responses payloads by @roboomp in #3120
- fix(ai): keep Bedrock toolConfig for no-tool tool history by @roboomp in #3125
- fix(tiny): stop respawning failed local model workers by @roboomp in #3133
- fix(ai): retry Anthropic TLS server transport errors by @roboomp in #3136
- fix(collab): chunked welcome so large session snapshots can join by @roboomp in #3145
- fix(agent): compact active goal yields by @roboomp in #3147
- fix(natives): resolve pre-existing clippy dead-code warnings breaking CI by @oldschoola in #3083
- fix(test): migrate fs.rmSync to removeSyncWithRetries in 5 more test files by @oldschoola in #3090
- refactor(coding-agent): replace new Promise constructor in AsyncDrain with Promise.withResolvers by @oldschoola in #3022
- fix(natives): remove unused test imports and dead test helpers by @oldschoola in #3087
- feat(coding-agent): save slash command text for /btw /tan /omfg /memory /rename /move to TUI history by @KamijoToma in #3138
- fix(compaction): floor context tokens by local estimate so payload compression can't suppress auto-compaction by @DarkPhilosophy in #3101
- fix(mcp): update startup connection status by @roboomp in #3151
- feat: show live slash command status in autocomplete by @wolfiesch in #3050
- Align collab-web shell with stats theme tokens by @lyc-aon in #2925
- Replace Robomp status tables with lifecycle cards by @lyc-aon in #2926
- fix(mnemopi): make proactive linking configurable from host settings by @wolfiesch in #2903
- feat(coding-agent): add copy affordance to completed /btw answers by @wolfiesch in #2950
Full Changelog: v16.1.7...v16.1.8