@oh-my-pi/pi-ai
Added
- Added regional Xiaomi Token Plan login/provider entries (
xiaomi-token-plan-sgp,xiaomi-token-plan-ams,xiaomi-token-plan-cn) soomp logincan store token-plan keys against the selected region. (#1846)
Fixed
- Removed the
context-1m-2025-08-07(1M long-context) beta from the Anthropic agent request headers, the OAuth model-discovery header, and the Claude usage-API header. Sending it caused subscription/OAuth requests without long-context credits to fail with429 Usage credits are required for long context requests, breaking Sonnet. The remaining betas are unchanged. - Fixed Kimi K2.x
maxTokenson Fireworks and Fire Pass (fireworks/kimi-k2.5,fireworks/kimi-k2.6,firepass/kimi-k2.6-turbo) being inherited from Fireworks/v1/modelsdiscovery (max_completion_tokens: 65536) rather than the published Kimi-on-Fireworks output budget, which let callers (and the openai-completions default-injection safety net) ship a budget the router cannot honor and made runaway reasoning traces more likely. The Fireworks resolver now clamps every Kimi K2.x id (public catalog ids and the canonicalaccounts/fireworks/{models,routers}/kimi-k2…wire form) to 32,768 output tokens, and the generator applies the same cap as a post-processing safety net so thefirepassstatic fallback and the bundledfireworksentries stay in sync across regens. (#1849) - Fixed Xiaomi Token Plan MiMo OpenAI-compatible tool-call continuations omitting required
reasoning_contentreplay. (#1846) - Fixed Anthropic prompt caching for OpenAI-compatible Claude proxies by honoring
compat.cacheControlFormat: "anthropic"outside OpenRouter. (#1845) - Fixed Moonshot Kimi K2.6 silently pausing for many seconds between tool calls because the server discarded the
reasoning_contentthat omp was already sending with every assistant tool-call replay. The K2.6thinkingparameter takes an extrakeepfield whose default (null) ignores historical reasoning, so K2.6 had to re-derive its full chain-of-thought from the user prompt on every iteration of the agent loop. The Moonshot direct (api.moonshot.ai) and Kimi Code (api.kimi.com) wire bodies now sendthinking: { type: "enabled", keep: "all" }forkimi-k2.6requests with reasoning enabled, matching Moonshot's documented best practice for multi-step tool-calling agents. The flag is gated on the K2.6 id and the two native hosts because earlier Moonshot models (K2.5 and below) 400 on the unknown field and every Kimi gateway (OpenRouter, OpenCode, Kilo, Fireworks, …) speaks its own thinking shape. (#1838) - Fixed Alibaba DashScope (Bailian) compatible-mode endpoint
400 InternalError.Algo.InvalidParameter: The provided messages input is invalid. The error info is [Unexpected item type in content.]when a screenshot or other image-producing tool result was folded into a known text-only Qwen turn (e.g.qwen3.7-max,qwen-max,qwen3-coder-*) hosted atdashscope.aliyuncs.com/compatible-mode/v1.convertMessagesinopenai-completionsno longer forwardsimage_urlcontent parts for those text-only id families even when a misconfigured custom provider claimsinput: ["text", "image"]; multimodal compatible-mode ids such asqwen3.7-plusandqwen-vl-maxstill rely on the cataloginputfield. The tool-result branch and the user-content branch both fall back to the standard[image omitted: model does not support vision]placeholder for text-only ids so the model still sees the attachment intent. (#1859)
@oh-my-pi/pi-coding-agent
Added
- Added deferred session-title generation so greetings no longer become the session title. A first user message that is only a greeting / acknowledgement / filler ("hi", "thanks", "ok", a bare number, emoji-only, etc.) is now detected deterministically and skips titling entirely — no title model is invoked. Title generation then retries on each subsequent user message while the session stays unnamed, so the title is deduced from the first message that actually describes work. A capable online title model may additionally answer
noneto decline a non-greeting taskless message (normalized to "no title").
Changed
- Changed mid-turn user steers to reach the model inside a wire-only interjection envelope, while transcripts and persisted session history keep the user's original text.
- Changed the system prompt to treat user requests for parallel work as
tasksubagent fan-out rather than parallel tool calls. - Changed the Agent Control Center's new-agent description field to use the multiline TUI editor, with Enter inserting lines and Ctrl+Enter generating the spec.
- Changed the Agent Control Center and Extension Control Center to accept Left/Right arrow keys for switching tabs (source / provider), in addition to Tab / Shift+Tab — matching the model and settings selectors, whose
TabBaralready supported arrow navigation. - Refreshed the Ctrl+R history search overlay: the selected row now renders as a full-width
selectedBghighlight bar, matched query tokens are highlighted in the accent color, each result shows a right-aligned relative timestamp, and the panel gained an icon'd accent title plus a two-tone keyhint footer. The selector also gained PageUp/PageDown (via the configurabletui.select.pageUp/pageDownkeybindings) and Home/End navigation. - Changed Perplexity API-key web search to return more comprehensive results:
web_search_options.search_context_sizeis nowhigh(wasmedium) for maximum retrieval grounding, the defaultnum_search_resultsis20(was10) so twice as many sources are surfaced, andreturn_related_questionsis enabled with the response'srelated_questionsnow parsed intorelatedQuestions(previously dropped). On an identical query this lifted the result from 10 sources / ~410 output tokens to 20 sources / ~1900 output tokens with a structured, multi-section answer; latency tracks model output length, not context size, so the 60s hard timeout headroom is unchanged.
Fixed
-
Fixed a streamed assistant message freezing at a partial prefix (e.g. only "Nat" of "Natives built, now…") on ED3-risk terminals (Ghostty/kitty/iTerm2/Alacritty), with the final text appearing only after a resize.
TranscriptContainerfreezes each non-live block by replaying its last live render, but render coalescing can finalize a block's content and append the next block within the same throttled frame — so the block was sealed at its stale mid-stream snapshot and never repainted until the nextthaw. The block that was live on the previous render is now recomputed once on the live→frozen transition, sealing it at its final content. -
Fixed ACP/RPC stdio startup so protocol frames are no longer consumed as one-shot piped prompt input before the JSON-RPC transport starts.
-
Fixed
omp completionsto await the completion script write before exiting. -
Fixed
AssistantMessageComponentexposing its stable-prefix completion API again so streamed assistant messages remain unstable until explicitly completed. -
Fixed session restoration to ignore transient fallback model switches (such as automatic context-promotion or retry fallback) so resumed or resumed-switch sessions revert to the configured default model unless the last change was a user-selected temporary model
-
Fixed in-session
/resumeto restore both the last user-selected temporary model and persisted plan/goal mode state instead of falling back to the default model with plan mode off. -
Fixed the
/resumesession picker overflowing short viewports: the visible window was hardcoded to 5 entries (and assumed 3 lines each), but titled sessions render 4 lines, so on a typical-height terminal the picker's header and search box scrolled off the top and the first entry was hidden until you scrolled the terminal up. The visible-entry count is now derived from the live terminal height (budgeting the worst-case 4-line titled entry plus the picker's chrome), so the whole picker fits the viewport and grows on taller terminals. -
Fixed the Agent Control Center and Extension Control Center dashboards overflowing the terminal: they were mounted inline below the chat transcript, so the combined height exceeded the viewport — the tab bar and controls scrolled off the top into native scrollback, and every state change yanked the view back to the bottom. Both dashboards now render as full-screen overlays sized to the live terminal height (
process.stdout.rows), re-fit on resize, fill the viewport, and reserve space for the footer keyhints so the controls stay visible. -
Fixed Ctrl+R history search results to remain globally sorted by prompt recency after merging FTS prefix matches with substring fallback matches.
-
Fixed Exa web search with no stored or environment credential to use the public Exa MCP fallback again, preserving the auth storage →
EXA_API_KEY→mcp.exa.airesolution order (#1860). -
Fixed ACP plan-mode writes to
local://PLAN.mdso session-local plan artifacts are written to OMP's local artifact root instead of being routed through the editorwriteTextFilebridge, avoiding Zen'sInternal errorand making the plan readable after creation (#1863). -
Fixed ACP plan mode stranding the agent at plan approval: entering
mode: "plan"now registers a standingresolvehandler so the agent'sresolve { action: "apply" }no longer fails withNo pending action to resolve. Nothing to apply or discard.The handler validates the plan file, asks the ACP client to confirm viaunstable_createElicitationwhen the client supports forms, renames the approved plan tolocal://<title>.md, and exits plan mode so the agent regains write tools for execution (#1869). -
Fixed
provider.appendOnlyContext: "auto"staying inactive for Xiaomi Token Plan/SGLang endpoints, preserving prefix-cache hits without forcing append-only mode globally (#1851). -
Fixed
models.ymlcompatibility parsing to preservecompat.cacheControlFormat: "anthropic"for custom OpenAI-compatible Claude proxies. (#1845) -
Fixed the TUI's
Settings → Pluginspanel reporting "No plugins installed" when only marketplace plugins were installed. The panel now mergesPluginManager.list()withMarketplaceManager.listInstalledPlugins()— the same data source the/plugins listslash command andomp plugin listCLI already used — and tags each row with an[npm]/[marketplace]kind badge, a scope tag, and a shadow indicator for project-shadowed user installs. Selecting a marketplace row opens a newMarketplacePluginDetailComponentwhose singleEnabledtoggle callsMarketplaceManager.setPluginEnabled(pluginId, enabled, scope), with read-only metadata (version, install path, installed-at, last-updated, git commit SHA) listed below the toggle. The empty-state now lists both install commands (omp plugin install <package>andomp plugin install <name>@<marketplace>) (#1842). -
Fixed scoped mnemopi recall in
MnemopiSessionState.collectScopedRecallResults/recallResultsScopedto await the asyncMnemopi.recallEnhancedso the new auto-derivedqueryEmbeddingflows through. Without this, the embedding-enabled mnemopi backend silently kept running FTS-only on every recall. (#1832) -
Fixed the SSH tool renderer inlining multiline remote commands into its single-line status header, which produced a malformed cell where the bordered output block opened mid-command. The renderer now drops the command from the header (which keeps only
[host]) and renders the full command in a framed section aboveOutput, mirroring the bash renderer.renderStatusLinealso flattens any embedded CR/LF indescription,meta, andtitleso no tool can accidentally expand the header into multiple rows (#1828). -
Fixed
tsc --noEmitagainstpackages/coding-agent/tsconfig.jsonreporting 56 errors under TypeScript 5.x (builtin-registry.ts× 46,agent-session-openai-responses-replay.test.ts× 10). The repo's own gate (tsgo/ TypeScript 6.x) already accepted the() => voidslash-command handlers, but 5.x rejects them because it does not coerce avoid-returning function value into a() => T | undefinedslot. TheSlashCommandSpec.handle/handleTuisignatures and the test'screatePersistedSessionpopulatecallback are now expressed as a union of two function types (one returning aSlashCommandResult/ target, one returningvoid), so the existing handler bodies typecheck on both compilers (#1821). -
Fixed
omp updateleaving@oh-my-pi/pi-nativesand the platform-specific@oh-my-pi/pi-natives-<tag>leaf at the previous version onbun install -gupdates, so the next launch loaded a stale.nodefile and aborted atvalidateLoadedBindingswithThe .node file on disk is from a different release than this loader.omp updatenow pins the native addon core and the platform leaf to the same version it installs for@oh-my-pi/pi-coding-agent(#1824).
@oh-my-pi/pi-mnemopi
Breaking Changes
- Changed
Mnemopi.recall(),Mnemopi.recallEnhanced(),Mnemopi.search(),Mnemopi.query(), the module-levelrecall/recallEnhanced/search/queryexports, theBeamMemory.recall/recallEnhancedmethods, the freerecall/recallEnhancedfunctions incore/beam/recall, andorchestrateRecallto returnPromise<RecallResult[]>so the recall pipeline can auto-derivequeryEmbeddingfrom the query text viaembedQuery. Callers mustawaitrecall calls; passqueryEmbedding: nullto opt out of auto-embedding and stay on FTS-only. - Changed the MCP entrypoints
handleToolCall,callToolJson, andhandleJsonRpcinmcp-server/mcp-toolsto async so the recall/shared-recall handlers can await the newPromise<ToolResult[]>shape; external MCP transports mustawaitthese.
Fixed
- Fixed
memory_embeddingsnever being populated by the productionremember/rememberBatch/updateWorking/consolidateToEpisodicpaths; embedding generation is now scheduled as a background task onbeam.pendingExtractions(mirroringscheduleFactExtraction), so configured providers (fastembed, OpenAI-compatible API, custom) actually run and rows land inmemory_embeddings(memory_id, embedding_json, model). (#1832) - Fixed
recall()/recallEnhanced()never deriving a query embedding from the query text, which silently degraded every deployment to FTS-only regardless of provider configuration. The recall pipeline now auto-callsembedQuery(query)whenoptions.queryEmbeddingis undefined; passnullto keep the old FTS-only behaviour. (#1832) - Fixed
toRecallOptionsdroppingqueryEmbeddingbetween theMnemopifacade and the beam layer, so callers can now explicitly pin or disable the query vector through the public API. - Fixed
withMemory(CLI) andwithBeam/withSharedBeam(MCP) closing the SQLite handle before background fact-extraction and embedding tasks finished, so short-livedmnemopi store/mnemopi sleepand MCPremember/updatepaths now drainflushExtractionsbefore close instead of silently droppingmemory_embeddingsrows. CLI handlers and MCPhandleRemember/handleUpdate/handleSleep/etc. are async as a result. (#1832, follow-up to #1833 review) - Fixed the process-wide
embedQuery()cache incore/embeddings.tskeying by query text alone, which let twoMnemopiinstances in the same process with different providers/models cross-contaminate theirdense_scorerankings. The cache key now includes a WeakMap-assigned provider identity, the resolved model name, and the configuredapiUrl, so disjoint runtimes never read each other's cached vectors. (#1832, follow-up to #1833 review)
@oh-my-pi/pi-tui
Fixed
- Fixed the OSC 11 appearance poll re-querying every 2s forever on terminals that support Mode 2031 but never change theme, whose repeated OSC 11/DA1 writes cleared the user's active text selection (breaking copy every 2 seconds). The poll now stops as soon as DECRQM confirms Mode 2031 support, since push notifications make polling redundant.
@oh-my-pi/pi-utils
Fixed
- Hardened
getIndentationagainst malformed paths: any filesystem error from the.editorconfigprobe (e.g.ENAMETOOLONGon oversized garbage path segments) is now swallowed and cached as a miss instead of escaping and crashing the TUI mid-render (#1871). - Fixed
getIndentation(and the edit renderer'sreplaceTabscallers) crashing withENAMETOOLONG/ENOTDIR/etc. when handed a path with an overlong component or a non-directory in its parent chain. Editorconfig discovery now short-circuits to the default tab width on any path component aboveNAME_MAX(255 bytes) and absorbs anyFsErrorwhile walking the editorconfig chain — best-effort discovery must never escape as an uncaught exception (#1872).
What's Changed
- fix(robomp): backfill partial-clone blobs before worktree add by @roboomp in #1820
- fix(coding-agent): made slash-command handlers compatible with TypeScript 5.x by @roboomp in #1822
- fix(coding-agent): sync pi-natives on omp update by @roboomp in #1825
- fix(tools/ssh): render multiline remote commands in a framed body block by @roboomp in #1830
- fix(mnemopi): populated memory_embeddings on remember and auto-derived queryEmbedding on recall by @roboomp in #1833
- fix(ai): preserve kimi-k2.6 reasoning across tool calls by @roboomp in #1839
- fix(robomp): serialize same-issue event claims by @roboomp in #1841
- fix(tui): list marketplace plugins in settings panel by @roboomp in #1844
- fix(ai): honor Anthropic cache-control compat for OpenAI-compatible providers by @roboomp in #1847
- fix(providers): add Xiaomi Token Plan support by @roboomp in #1848
- fix(providers): cap Kimi K2.x maxTokens on Fireworks/Fire Pass at 32,768 by @roboomp in #1852
- fix(providers): enable append-only auto for xiaomi sgLang endpoints by @roboomp in #1854
- fix(mcp): update completed tool status icons by @roboomp in #1856
- fix(ai): drop image content for DashScope compatible-mode text-only Qwen by @roboomp in #1861
- fix(coding-agent): restore Exa MCP fallback by @roboomp in #1862
- fix(coding-agent): keep local plan writes off ACP bridge by @roboomp in #1864
- fix(utils): swallow editorconfig probe errors to keep TUI rendering safe by @roboomp in #1873
- fix(utils): tolerate malformed paths in editorconfig indentation lookup by @roboomp in #1874
Full Changelog: v15.9.0...v15.9.1