github can1357/oh-my-pi v16.1.8

6 hours ago

@oh-my-pi/pi-agent-core

Breaking Changes

  • Changed transformProviderContext and buildSideRequestContext to return a Promise

Added

  • Added buildSideRequestContext to the Agent class 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 a before_provider_request payload 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 normalizeMessagesForProvider and resolveOwnedDialectFromEnv from packages/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_calls unset instead of forcing serial tool calls; Codex responsesLite still disables parallel tool calls when tools are present.

Fixed

  • Fixed Bedrock /btw and other no-tool ephemeral turns failing after prior tool calls by sending the required sentinel toolConfig whenever replayed history contains toolUse/toolResult blocks. (#3124)
  • Fixed Anthropic Messages pre-content TLS bad record MAC server 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-responses forwarding 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-default StreamOptions saw every turn fail. The provider now drops the full sampling set (matching codex-rs), and the auth-gateway's defensive strip on both buildStreamOptions and the pi-native path was widened from {temperature, topP} to the same set plus stopSequences/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 with 400 Extra inputs are not permitted, field: 'enable_thinking'. Fireworks serves Qwen3 with controllable thinking via OpenAI-style reasoning_effort and rejects the top-level enable_thinking boolean that Alibaba DashScope speaks; buildOpenAICompat was selecting thinkingFormat: "qwen" from the qwen id pattern regardless of host. Fireworks-hosted Qwen models now resolve to thinkingFormat: "openai".
  • Fixed MiMo models on OpenAI-compatible gateways to expose only accepted low, medium, and high reasoning tiers and map unsupported raw minimal/xhigh requests 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 /btw answers so users can copy the visible side-answer text before branching or dismissing the panel.

Changed

  • Updated SnapcompactInline and 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 /move to 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 /model for role model assignment. (#2952)
  • Replaced new Promise((resolve, reject) => ...) in AsyncDrain with Promise.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 EventController tests where a missing settings property in the InteractiveModeContext mock object led to calling .get on 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 rewind tool
  • Fixed rewind tool output and temporary assistant side-channel data polluting the prompt cache
  • Fixed read against 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 at MIN_COLUMN_WIDTH=1 so 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 vertical column: value block layout per row when the column count exceeds the horizontal width budget. (#3107)
  • Fixed skill://, local://, memory://, and vault:// 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_inference for the same failed model, and blocked the unsupported Qwen3 1.7B ONNX memory model before load. (#3132)
  • Fixed /join failing with timed out waiting for the host's welcome on collab sessions whose existing transcript was more than a few MB. The host now sends a small welcome frame (header + state + agents + entryCount) followed by a train of snapshot-chunk frames (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 new COLLAB_PROTO = 2 on 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 at MNEMOPI_EMBEDDING_MAX_INPUT_CHARS (default 8192 chars) and clips with a head/tail split so a long multi-turn MnemopiSessionState.retainMessages transcript can't make llama.cpp's /embeddings server reject the request with request (N tokens) exceeds the available context size and 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 /goal continuation turns that end with a successful yield skipping threshold auto-compaction while the active goal remains over compaction.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)
  • /resume and omp --resume no 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 export and /todo import in 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 buildSystemPrompt helper to render caller-provided tools instead of falling back to the default prompt inventory, and to keep no-tools-map skills visible when read is 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 /omfg saved-state copy to advertise Esc dismiss after saving and registering the rule live.
  • Fixed legacy Pi extensions importing getModel/getModels from the @oh-my-pi/pi-ai package root failing to load, by restoring them as compatibility aliases for @oh-my-pi/pi-catalog's getBundledModel/getBundledModels. The root StringEnum compatibility 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 at NEVER 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, and AdvisorRuntime dedupes 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_request extension 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_LINKING environment variable, unlike the sibling mnemopi.polyphonicRecall / mnemopi.enhancedRecall settings: added a mnemopi.proactiveLinking config.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_LINKING still overrides the configured value when set (#2440).

@oh-my-pi/collab-web

Breaking Changes

  • Bumped COLLAB_PROTO to 2: the welcome frame now carries metadata only (header/state/agents/entryCount) and the transcript follows in a train of targeted snapshot-chunk frames terminated by final: 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-chunk frames into the transcript snapshot and only transitions to live after 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 SWAP that 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() at MNEMOPI_EMBEDDING_MAX_INPUT_CHARS (default 8192 chars, override via the env var or embeddings.maxInputChars runtime option; 0 disables) 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 /embeddings server used to reject the request with request (N tokens) exceeds the available context size, silently dropping vector recall for that memory (#3126).
  • Fixed the proactive-linking write path ignoring host configuration: proactiveLinkIfEnabled read MNEMOPI_PROACTIVE_LINKING directly, so a host that enabled proactive linking through configureRecallFeatures() had no effect unless the environment variable was also set. proactiveLinking is now a RecallFeatureFlags option resolved through a proactiveLinkingEnabled() fallback, matching the existing polyphonic and enhanced recall flags, with the MNEMOPI_PROACTIVE_LINKING environment 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 grep continuing 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 render and renderMany to 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 (&lt;, &gt;, &quot;, &apos;, &amp;), 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 as TempDir.removeSync().

@oh-my-pi/pi-wire

Breaking Changes

  • Bumped COLLAB_PROTO to 2. The welcome host frame now carries metadata only (header, state, agents, entryCount, optional readOnly) — the transcript moves to a new snapshot-chunk host frame ({ entries: SessionEntry[]; final: boolean }) sent immediately after the welcome. Hosts split large snapshots into multiple chunks; the last chunk carries final: 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

Don't miss a new oh-my-pi release

NewReleases is sending notifications on new releases.