Release notes
Oh My Pi v18.14.2
@oh-my-pi/pi-agent-core
Added
- The soft steering signal a tool sees as
toolCall.steeringSignalnow aborts with the source of the queued message ("user","irc", …) as itsreason, so a tool can yield only to the sources it should (#17537)
Fixed
- Reject incomplete local compaction, turn-prefix, handoff, and branch summaries ending with
stopReason: "length"instead of using truncated text as complete context. Omit incomplete display-only short summaries without discarding a completed full summary (#17499 by @Xytronix).
@oh-my-pi/pi-ai
Breaking Changes
- Replaced
isLoopGuardedModelwithloopGuardLevel, which returns"off","exact", or"semantic"from the model'sthinking-loop-guardcatalog rule
Added
- Added
disableServerSideFallbacktoFactoryDroidOptionsandSimpleStreamOptions: a Factory Droid request leaves out the server-side refusal fallback chain and fails, before any of its content is streamed, if another model answers it (#12229 by @Xytronix)
Changed
- DeepSeek and Grok models on Amazon Bedrock now get the same near-duplicate reasoning-loop checks as on other hosts
Fixed
- Fixed Claude turns failing with "Thinking loop detected" when summarized thinking repeated a progress line such as "Still writing the parser..."; Claude models no longer run the loop guard
- Fixed the loop guard discarding turns from other models whose reasoning summary repeats one status line a few times; whole-line repetition now has to cover about 1 KB before it counts as a loop
- Fixed per-request OpenAI-compatible headers being combined with differently cased model headers instead of overriding them (#17513 by @jchanghong023)
- Fixed a stalled Anthropic stream that keeps sending empty content deltas never timing out, because those deltas were treated as stream progress (#17484 by @jchanghong023)
- Fixed Anthropic-compatible endpoints that put a thinking signature on the streamed content block losing it, so replayed reasoning keeps its signed block (#17483 by @jchanghong023)
- Fixed
AuthStorage.close()andreplaceStore()losing a rotated OAuth refresh token when a refresh was still in flight, with or without durable refresh leases; the store now stays open until that token is saved, and new refreshes are refused (#17518) - Fixed
/usageshowing Cursor's "Other Models" meter as an inflated dollar amount; it now shows the percentage Cursor reports, like Cursor Models (#17462 by @eggpeat) - Fixed the
omp auth-gatewayResponses endpoint rejecting documented null values for temperature,top_p, output limits, reasoning, and reasoning summaries (#17466 by @Xytronix). - Fixed provider HTTP errors printing the response body twice when the thrown error already carried it, including responses with a retry header (#17503 by @metaphoric-dev)
- Fixed Gemini tool calls through the
omp auth-gatewaychat-completions endpoint failing on the next turn: the gateway now returns each call's thought signature inextra_contentand replays the one a client sends back (#17509 by @justdoGIT)
@oh-my-pi/pi-catalog
Breaking Changes
- Removed
thinkingLoopGuardfrom compat records;thinking-loop-guardis now a catalog axis that applies on every host, with"semantic"for Gemini, DeepSeek, and Grok and"off"for Claude
Fixed
- Fixed GitHub Copilot Claude 5.x base models (
claude-opus-5,claude-opus-5.5,claude-sonnet-5,claude-sonnet-5.5) reporting the 1M window of their-1mvariants once the model list was read from cache; discovered limits now survive cached reads instead of reverting to bundled values (#17481)
@oh-my-pi/pi-coding-agent
Added
- Added
task.perCallModel(offby default,eval,on) so a task item or an evalagent()/workpool()call can run on one exact model the operator already names: a chat role from your own (non-project) settings, the selected agent's own model, or the parent's current model. Glob values (anthropic/*) never approve a model.task.perCallModelAllownarrows that list,task.maxEffortcaps the worker's effort, and the worker never switches to another model. Project settings can only narrow this: they never turn it on or approve a model (#12229 by @Xytronix) - Added
Settings.reloadFromDisk({ includeParents: true }), which reloads the persisted settings behind an overlay while keeping the overlay's own overrides (#12229 by @Xytronix)
Changed
modelis now declared in every task schema: a task call, evalagent()orworkpool()that passes a model the operator's configuration does not allow is refused with an error (#12229 by @Xytronix)- Viewing a subagent or returning to the main session no longer posts a "Viewing agent …" / "Returned to main session" status (a popup in Tern); the status line and Tern's composer already show which agent is in view
- In a Tern pane,
omp statsshows the dashboard in place of the block it runs in, with a Close button (or Esc, or Ctrl+C) that stops it and brings the terminal back, and/statsopens it in a browser block beside omp, instead of the system browser bashtool commands now seePI_TOOL_CALL_ID, the id of the call running them, so a script the agent runs can point at that call in the session transcript (#17489 by @will-bogusz)- Native judgments with a configured fallback now move to it after a 3-second candidate deadline (configurable with
judgment.attemptTimeoutMs) and briefly skip the timed-out route; without a configured fallback a slow judge is never cut off or replaced (#17465 by @Xytronix).
Fixed
- Fixed a
!or$command run while the agent works floating over the composer in Tern, where expanding its output covered the conversation; it now sits at the end of the conversation - Fixed
out://replies sent from an eval cell (tool.writetoout://, ortool.bashwith> out://) never appearing even though the write reported "Shown to the user."; they now draw as replies after the eval card, and are refused where nothing would show them (a backgrounded cell, a browser tab script) - Fixed a
writetoout://(such asout://baselines.md) drawing as a Write card with line numbers instead of a reply streaming as prose - Fixed table charts drawing a
ratioorspeedup
…