fix(deps): update all non-major dependencies (minor) - #1987
Conversation
Signed-off-by:
|
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
Warning Review limit reached
Next review available in: 58 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (1)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request updates several dependencies in package.json and bun.lock. Specifically, @oh-my-pi/pi-coding-agent and @oh-my-pi/pi-natives are upgraded to ^16.2.2, and @sentry/cli is upgraded to ^3.6.0. Additionally, the lockfile reflects the removal of @vibe-kit/grok-cli along with its associated sub-dependencies, and the openai package is upgraded to version 6.39.1. There are no review comments, so I have no additional feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
This PR contains the following updates:
^16.1.13→^16.2.2^16.1.13→^16.2.2^3.5.1→^3.6.0Release Notes
can1357/oh-my-pi (@oh-my-pi/pi-coding-agent)
v16.2.2Compare Source
Added
tinymodel role for consolidated online task handling.textVerbositysetting to control OpenAI and Codex response detail.Changed
tinymodel role.Fixed
ui.loop-blockedwarnings during subagent-heavy runs by optimizing the mid-run compaction persistence check./advisorturns by ensuring advisor agents inherit the same provider-shaping options, hooks, and settings as the main agent.hashlineandapply_patchedit streams, ensuring rules are correctly applied to file paths parsed from section headers and envelope markers without leaking across file scopes.v16.2.1Compare Source
Fixed
models.ymlremote compaction schema support for V2 streaming endpoint fields. (#4146)cwdvalues of~and~/...before sending guaranteed-bad quoted tilde paths to remote POSIX shells. (#4002)v16.2.0Compare Source
Breaking Changes
searchtool togrepand thefindtool toglob. Existing user settings are automatically migrated to the new configuration keys.Added
ssh://host/pathsupport toread,search, andwritetools for single text files and directory listings on pre-configured POSIX SSH hosts./moveoverlay with path autocompletion and directory creation prompts, starting a fresh session in the target directory while leaving the previous session resumable.providers.maxInFlightRequestssetting to cap concurrent LLM requests per provider across local OMP processes.discovery.type: litellminmodels.ymlto automatically discover model metadata from LiteLLM gateways.models.ymlconfiguration optionsremoteCompactionandcompactionModelto run compaction on a separate model or opt into provider-native compaction.dap.jsonanddap.yamlsupport for defining or overriding debugger adapters used by thedebugtool.Changed
inlineToolDescriptorssetting from a boolean to a three-way enum (auto|on|off), defaulting toautoto inline descriptors only for Gemini models.Working…activity indicator below the sticky todo and subagent HUDs so it sits just above the editor instead of floating atop the todo panel.Fixed
web_search_prime, preserving the returned session ID for authenticated tool calls. (#3619)Cmd+Vsilently dropping image-only clipboard pastes in supported terminals.ssh://protocol handling, including support for IPv6 brackets, percent-encoded hosts, port validation, and POSIX shell restrictions, while preventing unsupported tools from attempting SSH connections./usagedisplay.0x0dimensions when image headers expose real dimensions.snapcompactcompaction silently falling back to LLM summaries when local preflight rejects the archive.snapcompactcompaction silently falling back to an LLM summary when local preflight rejects the archive; manual and auto snapcompact now fail locally with the blocker instead of making provider calls. (#3599)normalizeGeneratedTitle(packages/coding-agent/src/tiny/text.ts) used to force Title Case via a\b\p{Ll}regex, capitalizing function words ("for" → "For") and amplifying stray model capitals ("dAemon" → "DAemon"). It now reconciles each title token against the user's own message: tokens typed verbatim are kept; proper nouns the user cased distinctively are restored when the model flattened them ("tinyvmm" → "TinyVMM"); lowercase words carrying a stray interior capital the user never wrote are flattened ("dAemon" → "daemon"); and model-cased PascalCase proper nouns ("GitHub", "OAuth") are left untouched. Restoration is limited to distinctively cased source tokens so a message that merely starts with "For" can't force a mid-title "for" to "For". Applies to both the local tiny-model and online pi/smol title paths.to: "all") rendering twice in the main agent's transcript. A subagent broadcast fans out onebus.sendper live peer, andlistVisibleToalways includesMain, so the main agent received the body once as its ownirc:incomingcard and once per other recipient as anirc:relayobservation of the sibling legs (Sender → Other) — identical text shown N+1 times.IrcTool.#executeSendnow setssuppressRelayon every broadcast leg whenMainis among the targets (it already has the body via its direct incoming card), andIrcBus.sendskips#relayToMainUifor suppressed legs. Direct sub→sub relays, direct messages toMain, andMain's own outbound sends are unaffected.0x0dimensions whenBun.Imagerejects an image whose PNG/JPEG header still exposes real dimensions. (#3577)evaltool.*bridge leaking the harness-internali("intent") field into MCPtools/callrequests, so strict-schema servers (Linear, anything withadditionalProperties:false/ Zod.strict()) rejected every call with-32602 unrecognized_keys: ["i"]while the same call via the direct model tool-call path succeeded.MCPTool.execute/DeferredMCPTool.execute(packages/coding-agent/src/mcp/tool-bridge.ts) now stripINTENT_FIELDat the MCP boundary, so an MCP call behaves identically whether issued by the model directly or via the evaltool.*bridge; servers that legitimately declareias a real parameter keep it untouched. (#3575)Stop.,Done., andNo issue; continue.<advisory severity="blocker">injections, polluting the primary transcript and destabilizing the watched agent after the task was already complete. The advisor system prompt's rules ("at most oneadviseper update", "NEVER send the same advice twice") are now enforced in code by a newAdvisorEmissionGuardon theenqueueAdviceboundary inAgentSession: it normalizes each note (case-insensitive, punctuation-folded), drops content-free self-talk filler (stop/done/no issue continue/lgtm/etc.), dedupes by exact normalized text across the session (bounded FIFO history), and rate-limits to one accepted note per advisor model prompt cycle. Reset on advisor reset (compaction, session switch,/new) so a re-primed reviewer can re-raise old issues. (#3520)prepareCompactionkeeps that turn verbatim (findCutPointnever cuts at tool results), so the rewritten context stays above threshold; the context-full / snapcompact success tail scheduled the agent-authored auto-continue (and the overflow/incomplete retry) unconditionally, so the nextagent_endre-entered#checkCompactionover the same oversized tail and re-fired forever. This is the residual loop left after #3247 capped snapcompact's own frame projection — once the frame cap drops below one frame, snapcompact is skipped and the context-full summarizer path still made no headroom.#runAutoCompactionnow gates the threshold auto-continue on a post-maintenance headroom check (#compactionCreatedHeadroom, sharing shake'sCOMPACTION_RECOVERY_BANDhysteresis from #2275) and the overflow/incomplete retry on a separate fit check (#compactionCreatedRetryFit, measured after the failed turn is dropped) so a recoverable overflow that fits the window still retries; when a pass frees too little for the relevant path it pauses automatic maintenance and emits a single warning instead of looping. The post-turn threshold check also ignores an assistant's stale pre-compactionusageso the scheduled auto-continue cannot re-trip on the kept assistant's old high token count. The headroom check now treats any residual at or below the recovery band as progress: the band sits strictly under the compaction threshold, so a stale/tool-output prune that already pushed the trigger sub-band no longer makes a residual that merely holds the line report a false "no progress" and suppress a valid auto-continue.paths[0]array flattening. (#3483)agent()helper subagents remaining visible as idle/IRC-revivable peers after the helper call returns; one-shot eval subagents now dispose and unregister at completion. (#3407)session.abort()fire-and-forget, sorunSubprocesscould resolve and adopt the subagent before its abort cleanup finished clearing in-flight session state. Active-subagent aborts are now deduped through a single cached cleanup promise that the subprocess awaits (bounded) before finalizing. (#2805)hideThinkingBlocksetting. Toggling thinking block visibility while thinking is off shows a status message instead of silently no-op'ing. (#626)remainingFraction(nousedFraction,used/limit, orpercent+used). The TUI's localresolveFractionwas missing the inverted-remaining fallback that the sharedresolveUsedFractionfrom@oh-my-pi/pi-aialready handles — replaced the local copy with the shared function so the TUI and CLI paths resolve fractions identically.⏳ SSH: [host]header above the final⇄ SSH: [host]header in terminal scrollback. The SSH renderer now keeps its partial-result chrome on the pending icon/state and opts the block out of stream-commit whileisPartialholds (via the newToolRenderer.provisionalPartialResultflag honored byToolExecutionComponent.isTranscriptBlockCommitStable), so the stable-prefix ratchet can't promote the partial header to native scrollback only to have the final render strand it above the settled frame (#3177).**Refining …**,## Examining …) without ever issuing a tool call. The session now interrupts that stream, discards the partial reasoning turn, injects a hidden tool-call reminder, and continues with the corrective context instead of burning the full budget on planning.Cmd+Von macOS silently dropping image-only clipboard pastes (screenshot viaCmd+Shift+5"save to clipboard", Chrome image copy, …) — the user had to fall back toCtrl+V. Follow-up to #3506: that fix handled clipboards exposing a file URL or path; the screenshot path leaves only raw image bytes on the pasteboard. macOS terminals (iTerm2, Terminal.app, Warp, Ghostty without OSC 5522, Windows Terminal forwarding, …) interceptCmd+Vand readNSPasteboardTypeStringfirst; for an image-only clipboard that read returns"", so the terminal forwards a complete-but-empty bracketed paste (\x1b[200~\x1b[201~).CustomEditor.handleInputinserted the empty payload and the keystroke disappeared.CustomEditornow runs its ownBracketedPasteHandlerahead of the inherited handler so the assembled paste payload is routed regardless of whether the start marker, payload, and end marker arrive in one stdin chunk or are fragmented across several (Windows Terminal under load, certain SSH muxes, tmux extended-keys passthrough, …). Strict-zero-length assembled payloads route to the sameonPasteImagesmart reader theapp.clipboard.pasteImagekeybind uses (attaches the clipboard image, or falls back to the #1628 smart text paste / "clipboard is empty" diagnostic); explicit image-file paths route toonPasteImagePath(the #3506 path also benefits from split-chunk assembly); everything else hands off to the base editor'spasteTextso[Paste #N]markers, autocomplete, and undo state stay intact. Whitespace-only pastes are preserved as literal text. Trailing keystrokes that arrive in the same stdin read as the paste (a user hittingEnterright afterCmd+V) are queued behind the in-flight clipboard read and only dispatched once the image has reachedpendingImages, so submit can't fire against an empty draft and leave the image stranded on the next prompt. (#3601)v16.1.23Compare Source
Added
compaction.midTurnEnabledfor mid-turn threshold auto-compaction before the next tool-loop provider request. (#3525)grep -q/--quiet/--silentand-x/--line-regexpto the in-processgrepbuiltin used by the bash tool.-qsuppresses all stdout and exits 0 on the first match (short-circuiting, with match status taking precedence over read errors per GNU);-xanchors each pattern to whole lines. Unblocks shell conditionals such asgrep -qx "$applet" <(strings bin).SWAP.BLK/DEL.BLK/INS.BLK.POSTanchored on markdown headings — a heading resolves its whole section (through nested deeper headings), so the agent can rewrite, drop, or append sections without rewriting the file.tui.renderMermaidto control Mermaid fenced-block ASCII rendering; disabling it also removes the Mermaid diagram hint from the generated system prompt so Mermaid blocks fall back to ordinary highlighted code fences./resume <session-id>in the interactive command system, reusing the existing session-id/prefix resolver while bare/resumestill opens the selector.omp gcstorage maintenance withgc.*defaults for blob sweeping, cold-session archiving, and SQLite WAL checkpointing.Fixed
/resume <session-id>in the interactive TUI only searching the active cwd's session directory; id-prefix lookup now falls back to sessions from other cwd buckets like CLI--resume <session-id>.StdioTransport.connect()now probes whether OMP already has an inheritable console andresolveStdioSpawnCommandskipswindowsHide/CREATE_NO_WINDOWin that case, socmd.exe/PowerShell grandchildren reuse the terminal console instead of allocating visible conhosts during MCP startup or reconnects. (#3567)replaceunlessedit.modelVariants,PI_EDIT_VARIANT, orPI_STRICT_EDIT_MODEexplicitly opts into hashline.default = sonnet:offwhile plan-mode raised thinking tohigh) goes throughapplyRoleModelinstead of silently restoring the pre-plan level. (#3554)modelRoles.planconfigured, default unset, sogetRoleModelCyclesynthesizes a lonedefaultentry from the active plan model and the slider stays hidden) is no longer pinned as the execution tier — approval falls through to the pre-plan restore instead of silently switching back to the plan model. (#3554)evalJulia kernel showing only runner-internal backtrace frames (at top-level scope (./none:N),at main (…runner-…jl:635)) with no exception type or message, making cell errors undebuggable. The host renderer (packages/coding-agent/src/eval/kernel-base.ts) displays a non-emptytracebackverbatim and only falls back toename: evaluewhen it is empty; the Python and Ruby runners embed the rendered error intraceback, but the Julia runner (packages/coding-agent/src/eval/jl/runner.jl) builttracebackfrom stack frames only, so the message was dropped.emit_errornow seedstracebackwith theshowerroroutput (matching the REPL'sERROR:text) ahead of the frames.cmd.exewrapper that itself launched a console grandchild —nodewrappers,npx.cmd -y mcp-remote, similar nested shells.StdioTransport.connect()unconditionally passeddetached: truetoBun.spawn, but Windows has no SIGTSTP/SIGTTIN to escape;detachedonly maps toCreateProcess(DETACHED_PROCESS), which strips the parent's inherited console. The hidden directcmd.exelost its console, so the grandchild allocated a brand-new visible conhost whose stdout no longer routed through OMP's pipe — the proxy reported the bridge was up while OMP timed out waiting for the MCPinitializeresponse.resolveStdioSpawnCommandnow returnsdetached: falsefor every Windows return shape (direct.exe, cmd.exe-wrapped batch / unresolvable command, npm cmd-shim launched through node) and keepsdetached: trueon POSIX, where the original SIGTSTP/SIGTTIN reason still holds;connect()consumes the resolved flag. (#3544)getConfiginpackages/coding-agent/src/lsp/index.ts) never being invalidated, so.omp/lsp.json, root markers, and plugin LSP configs added after the first LSP call stayed invisible for the remainder of the process — even afterreload *. The cached observation persists across chat sessions because OMP is a single-process binary, so users were stuck onNo language servers configureduntil they killed the process. Thereloadhandler now drops the cwd's cache entry and re-runsloadConfigbefore iterating servers, so the explicit refresh request behaves as the prompt documents. (#3546)preserveData.snapcompactis now stripped after hook- and result-supplied preserve data are merged, so a prior snapcompact pass can no longer leak frames into a later context-full compaction. (#3561 by @serverinspector)text/textHead/textTailregions are now obfuscated alongside the previous summary, while opaque provider-replay state (OpenAI remote-compactionencrypted_content) stays byte-identical. (#3561)modelRoles.defaultwhen the configured default lives on an extension-registered provider (e.g. an openai-compat plugin'sposthog/claude-opus-4-8).createAgentSessionresolved the default role before extension factories registered their providers, so the role-pointed model wasn't visible there; on a fresh launch (no-c/--resume) the post-extension fallback then went straight topickDefaultAvailableModel, replacing the user's configured default with the first bundled provider default with auth (commonlyopenai/gpt-5.5whenOPENAI_API_KEYwas set). The fallback now retries the default-role lookup against the post-extension allowed-model set — including its explicit thinking selector — before falling back to a bundled provider default. (#3569)v16.1.22Compare Source
Fixed
cmd.exewindow for direct executable servers; MCP subprocesses now setwindowsHideon every Windows spawn path. (#3535)Authorization failed: An unexpected error occurredagainst Plane'shttps://mcp.plane.so/http/mcpendpoint after #3502. The protected-resource metadata advertised the path-scoped issuerhttps://mcp.plane.so/http, butdiscoverOAuthEndpoints(packages/coding-agent/src/mcp/oauth-discovery.ts) probed/.well-known/oauth-authorization-serverat the origin root first and accepted the metadata served there — which describes a different issuer (https://mcp.plane.so/) whose/authorizeendpoint rejects every grant. Discovery now honors RFC 8414 §3.3 and skips authorization-server / OpenID Connect well-known documents whoseissuerfield doesn't match the queried base URL (trailing-slash insensitive). Servers that omitissuerkeep today's permissive behavior, so legacy flows are unaffected. (#3537)v16.1.21Compare Source
Fixed
autolearn.autoContinue(the "Auto-run capture at stop" toggle) letting the synthetic capture turn keep working after thelearn/manage_skillcall instead of yielding. With the toggle on, the controller firesautolearn-nudge.mdas a singleattribution: "user"message on a new turn; the prompt opened with "Before you finish:" and gave no terminal contract, so the agent treated the synthetic prompt as the user's reply to its prior pending question (e.g. "Want me to commit and push?") and continued — pushing commits, running tools, etc. — without the user ever answering. The nudge is now split into two prompts: passive mode (the reminder rides the user's real next message) keeps additive framing — "answer the user normally; the capture is in addition to" — while auto-continue mode (autolearn-nudge-autocontinue.md) is explicitly terminal — "not a user reply; do not treat this as approval; capture, then stop; wait for the user's next prompt". Attribution staysuserto preserve llama.cpp warm-prefix reuse (#3456). (#3504)Cmd+Con a.png, certain screenshot tools),arboard::get_image()returnsContentNotAvailableandpbpaste(1)returns empty (it only surfaces plain text / RTF / EPS), soInputController.handleImagePasteeither fell through to the #1628 text fallback and pasted the path verbatim, or dead-ended with "Clipboard is empty". The keybind path now (1) reaches thepublic.file-urlrepresentation directly via a newreadMacFileUrlsFromClipboardAppleScript bridge on Darwin and routes the first image-shaped path throughhandleImagePathPaste, (2) reuses a newextractImagePathFromTexthelper so any clipboard-text path that survivedpbpasteis detected the same way the bracketed-paste handler already detects them — including a whole-text-as-path fallback for anchored paths whose unescaped spaces would otherwise be shredded by the bracketed-paste splitter (macOS screenshot names like/Users/me/Desktop/Screenshot 2026-06-25 at 1.23.45 PM.png), and (3) decodesfile://URLs to filesystem paths innormalizePastedPath(mirroring Codex'snormalize_pasted_pathincodex-rs/tui/src/clipboard_paste.rs). Keybind- and terminal-mediated paste now agree on raw image bytes, plain image paths,file://URLs, Finder-copied image files, and screenshot filenames with spaces alike. (#3506)pi.extensionspackages whose source imports worker-only coding-agent subpaths or extension-local package subpaths such astypebox/value;omp install @​charmland/pi-hyper-provider,omp plugin doctor, and runtime provider discovery now use a main-thread-safe load path. (#3508)Authorization failed: An unexpected error occurredagainst authorization servers (Plane is the live example) that reject redundant fallbackresourceindicators. OMP now drops same-origin resources only when it synthesized them from the server URL fallback (e.g.https://mcp.plane.so/http/mcp). Provider-advertised resources from OAuth/protected-resource discovery or an embedded authorization-URLresourcequery parameter are preserved even when they are same-origin or origin-only, so gateway-hosted MCP services can still request the audience they advertised. The refresh-token path uses the same policy, filtered against the authorization-server origin persisted on the credential asauthorizationUrl, withtokenUrl's origin as the legacy fallback when that field is absent. (#3502)v16.1.20Compare Source
Fixed
ui.stop()) but the process kept running inSl+state, leaving the user with a dead terminal recoverable only viakill -9. The embeddedbrush-coreshell behind every bash tool call installs a tokio SIGTSTP listener onProcess::wait(crates/brush-core-vendored/src/sys/unix/signal.rs::tstp_signal_listener→tokio::signal::unix::signal(SIGTSTP)); per tokio's contract, the first call for a SignalKind permanently replaces the kernel-default handler for the lifetime of the process. So the first bash invocation — even/usr/bin/true— silently overrode SIGTSTP's "stop" default, andInputController.handleCtrlZ's subsequentprocess.kill(0, "SIGTSTP")was swallowed by tokio. The handler now sendsSIGSTOP(uncatchable, unblockable, unignorable) to the foreground process group, so the kernel parks omp regardless of installed handlers and the shell sees the whole job stop even when omp runs behind a wrapper (npx,pnpm exec,bunx, …) or as one stage of a pipeline. MCP stdio servers now spawn detached into their own session — they're insulated both from terminal job-control signals (which used to stop their process trees and leave the JSONL read loop blocked on silent pipes) and from the new pgid=0 suspend itself (#3461).omp gallery --stateaccepting lifecycle tokens that did not match displayed state labels and rendering unknown state values as· undefined; displayed labels now work as aliases, invalid values fail with a valid-token list, and failed gallery fixtures visibly render failures. (#3473)mise()shell function dying withcommand: command not found:because$__MISE_EXEwas empty in the replay shell.generateSnapshotScriptcaptured the function viadeclare -f/typeset -fbut only ever re-exportedPATH, so every other env var the rc file set (notably the*_EXEsidecarmise activateexports) was lost; the function body then expandedcommand "$__MISE_EXE" "$@​"tocommand "" …and died with exit 127. The snapshot script now scans captured function bodies for$VAR/${VAR…}references and re-emitsexport NAME='value'for each referenced var that is currently set (with a denylist for shell-internal names likePATH/HOME/BASH_*/LC_*plus a likely-secret denylist for*TOKEN*/*SECRET*/*API_KEY*/*PASSWORD*/*PRIVATE_KEY*/*ACCESS_KEY*/*CREDENTIAL*/*SESSION_KEY*), the snapshot scriptumask 077s itself and the JS caller chmods the snapshot file/dir to0600/0700so the new export pass can't leak secrets into a shared tmp dir. Fixes mise, asdf shims, direnv-style helpers, and other activation idioms that pair a function with a helper env var.getShellConfigFilenow also honoursenv.HOME(falling back toos.homedir()) so sandboxed callers can target a non-default rc. (#3470)history://transcript rendering forfindandsearchso scopedpathsarguments are visible instead of being hidden behind JSON fallback output or omitted when a searchpatternis present. (#3482)/compactleavingsession.isCompactingfalse while active-turn abort teardown awaited, so the first steer/follow-up typed during compaction startup now routes through the compaction queue instead of being lost. (#3485)providers.ollama-cloud.maxConcurrency) being replaced with a fresh semaphore whenever the configured limit changed, which orphaned the in-flight slots on the old instance and let a runtime or mixed limit value exceed the cap. The limiter now resizes a single shared semaphore in place — raising the ceiling admits queued waiters immediately, lowering it drains in-flight holders without admitting past the new cap. (#3464)task.maxConcurrencylimiter when progress reporting threw between acquiring the slot and entering the guarded run:markRunning/reportProgressnow run inside the try whosefinallyreleases the semaphore, so a failed progress report can no longer permanently shrink subagent concurrency. (#3464)yieldand then receive a trailing empty assistantstopskipping threshold compaction; post-yield empty-stop suppression now still anchors active-goal compaction on the yield-bearing assistant turn, so long-running tasks continue after maintenance instead of settling early.v16.1.19Compare Source
Fixed
omp install <plugin>failing extension validation in compiled-binary mode withCannot find module '@​(scope)/pi-ai/oauth' from '<plugin>/src/oauth.ts'(and any other non-wildcard pi-* subpath import like@oh-my-pi/pi-coding-agent/tools). The bundled-registry override map seeded by__buildLegacyPiPackageRootOverridesonly covered the bare package roots, sorewriteLegacyPiImportsrewrote@(scope)/pi-ai/oauthto@oh-my-pi/pi-ai/oauth, fell through toBun.resolveSync(which bunfs can't satisfy on Bun 1.3.14+), then left the original specifier alone — at which point Bun's native resolver failed because most plugins declare@(scope)/pi-aias apeerDependencyonly and never materialize a real install. The newscripts/generate-legacy-pi-bundled-registry.tsreads every bundled pi-* package's non-wildcardexportsfield and emits both the heavylegacy-pi-bundled-registry.ts(static imports + map) and a lightlegacy-pi-bundled-keys.ts(statically imported bylegacy-pi-compat.tsto seed the override map without the cascade throughlegacy-pi-coding-agent-shim → ../index → export/html/...).scripts/build-binary.tsnow runs the generator beforebun build --compile. (#3442)skill://tool resolution losing loaded session skills when a tool runs outside the session-initialization module state. Internal URL resolution now prefers the caller'ssession.skillssnapshot before falling back to the process-global skill list, soread skill://<name>works across tool execution boundaries. (#3436)@imagementions on OpenAI Codex Responses (chatgpt.comgpt-5.5and siblings) failing withCodex error event: [OneOfParam] [input[N].content[…]] [invalid_enum_value] Invalid value: 'input_image'. Supported values are: 'input_text'..convertToLlmforfileMentionalways emitted adeveloper-role message, so the auto-attached image landed in a Responses content array that the Codex backend (and OpenAI Responses generally) only allows to carryinput_text. #3421's previous fix only stopped the Codex Responses Lite header from going out on image-bearing turns; the full transport kept rejecting the same payload.convertToLlmnow splits a mixed-contentfileMentioninto two messages — text-only files stay ondeveloper(so the auto-read context keeps instruction priority), while image-bearing files ride onuser(the only Responses content slot that acceptsinput_image). (#3443)local://binary attachments being decoded withBun.file().text()before read-tool file safeguards could reject or stream them.read local://...now routes file-backed resources through the normal filesystem reader, the protocol handler refuses known binary/container resources without materializing their bytes, and the streaming reader's NUL-byte refusal now also covers binary blobs whose first newline lies beyond the byte budget (videos, archives) — those previously bypassed the per-line scan and surfaced as decoded mojibake. (#3448)v16.1.18Compare Source
Added
Changed
/extensions(the Extension Control Center) now opens as a fullscreen window on the terminal's alternate screen, matching/settings: it borrows the alt buffer for its lifetime (the transcript is untouched underneath) and uses the same modern chrome — a titled rounded frame, the sharedTabBarfor provider switching, and a divider/footer layout. The dashboard is now mouse-aware: the wheel scrolls the list (and the detail inspector, which gained its own scroll viewport), hovering highlights tabs and rows, and clicking selects a row or — when it is already selected — toggles it; clicking a provider tab switches to it. Empty enabled providers are unselectable while disabled providers stay selectable so their master switch can re-enable them.Fixed
omp installof legacy pi extensions failing withCannot find module '/$bunfs/root/packages/coding-agent/src/extensibility/typebox.js'on every releasedomp-<platform>-<arch>binary. Commitdc5c93462fremoved worker entrypoints fromscripts/ci-release-build-binaries.ts; the inline comment then claimed the legacy-shim and package-barrel entrypoints (typebox.ts,legacy-pi-{ai,coding-agent}-shim.ts,packages/{agent,natives,tui,utils}/...) were "still" passed tobun build --compile, but they had never been re-added. The release binaries shipped without those files in bunfs, solegacy-pi-compat.tsredirectedtypeboximports to a bunfs path that didn't exist.__resolveTypeBoxShimPathnow mirrors__validateLegacyPiPackageRootOverrides(#2168) by dropping the override when the shim file is missing, so a missing shim falls through to nativenode_modulesresolution instead of emitting a dead bunfs URL (#3414).@(scope)/pi-*and@sinclair/typeboximport failing to load on theomp-darwin-arm64release binary (and any otherompbuilt with Bun 1.3.14).__validateLegacyPiPackageRootOverridesand therewriteLegacyPiImportsemit path both depended on--compileextras being reachable as/$bunfs/root/...filesystem entries, but Bun 1.3.14 stopped exposing them through every API (fs.existsSync,Bun.file().exists(),Bun.resolveSync,await import()on the bunfs path or itsfile://URL all fail; only/$bunfs/root/<binary-name>itself answers).legacy-pi-compat.tsnow keeps a JS-heap reference to every bundled pi-* surface in a lazy-loaded siblinglegacy-pi-bundled-registry.tsand serves them through anomp-legacy-pi-bundled:virtual namespace whoseBun.plugin().onLoadreturns synthetic re-exports — no bunfs path ever leaves the module in compiled mode, and dev / source-link / installed-package modes keep the historicalfile://rewrite. The matching--compileextras inscripts/build-binary.ts, the sharedscripts/binary-entrypoints.tslist, and the deadBUNFS_PACKAGE_ROOT/bunfsPath/__computeBunfsPackageRoot/__joinBunfsPathhelpers are gone. (#3423)v16.1.17Compare Source
Fixed
MnemopiSessionState.retainMessagesstill stores the full multi-role window for episodic recall, but passes only user-authored turns asextractText, so assistant prose containingalways/neverno longer becomes durable userInstruction:memory. (#3372)Bun.write(dest, response)receives a streamingfetch()Response; tool assets now stream the response body to disk with the existing download abort signal and remove partial files on abort. (#3369)path.joinwas used unconditionally, producing Windows-style paths that POSIX shells can't resolve. The installer now usespath.posix.joinfor non-Windows platforms and normalizes script paths to forward slashes for POSIX shell alias blocks, soomp --aliasworks correctly in Git Bash and WSL.local://attachment-N.<ext>references while image paths keep the image attachment flow. (#3360)/plan,/goal,/mcp,/ssh) stored their text; all other built-in slash commands were silently skipped becauseexecuteBuiltinSlashCommandreturnedtruebeforeaddToHistorywas called. History is now centralized in the input controller after successful command dispatch. Commands that may carry secrets (/login <url>with OAuth callback params,/mcp add --token <token>) are excluded from history to prevent credential leakage (#3148)asktool's "Other (type your own)" free-text editor (prompt-styleHookEditorComponent) ignoring Ctrl+Q and Ctrl+Enter, so Windows Terminal users who learned theapp.message.followUpchord from the main editor (#1903 / fixed by #1905) got zero feedback on submit. The hook-style and main-editor surfaces honoredmatchesAppFollowUp; the prompt-style handler did not, leaving plain Enter as the sole submit path and Ctrl+Enter falling through to Editor as a newline (silently swallowed by WT).#handlePromptStyleInputnow checksmatchesAppFollowUpfirst — mirroring#handleHookStyleInput— and the hint readsenter or ctrl+q submitso the chord is discoverable. (#3353)/settings(or the Extensions/Agents dashboard) is open. The fullscreen overlay's close handler restored focus to the editor it had captured at open time, butExtensionUiControllerhad since swapped the editor out of the editor slot for the approval prompt — so on exit the visible prompt sat unreachable while keystrokes routed to the now-unmounted editor (no Enter/Up/Down/Esc response, only Ctrl+C escaped).SelectorControllernow restores focus to whatever currently owns the editor slot via afocusActiveEditorArea()helper, applied to settings, extensions dashboard, and agents dashboard close paths. (#3349)/settingscoercing enum/text values to display strings before handing them to the TUI list, preventing YAML numeric enum values from reaching native truncation (#3338).omp-darwin-arm64release binary (downloaded directly or via a Homebrew tap wrapper) because__computeBunfsPackageRootmis-handledimport.meta.dir = "//root/omp-darwin-arm64". Bun 1.3.14 reports<bunfs-root>/<binary-name>for the compiled entry'simport.meta.dir, but the pre-fix function joinedmetaDir + "packages"and produced/root/omp-darwin-arm64/packages— the binary basename was baked into every bunfs path, so the TypeBox/legacy-pi shims and every@oh-my-pi/pi-*package-root override failedexistsSyncvalidation andresolveCanonicalPiSpecifierfell through to a bunfsBun.resolveSyncthat also could not find the module. The function now detects the bunfs-root + binary-basename shape (path.basename(path.dirname(metaDir)) === "root") and strips the trailing binary segment by slicing the originalmetaDir; the production bunfs shim join path also preserves Bun's bunfs-native//root/B:\~BUN\rootprefix thatpath.joinwould otherwise collapse. (#3329)/v1/modelsmeta.n_ctx/meta.n_ctx_trainvalues, refresh selected models after lazy load, and bypass fresh-cache reuse so server restarts update context windows. (#3310)task.maxConcurrency: 0serializing subagent spawns instead of running them unbounded. The settings UI labels0as "Unlimited", but the session-scoped spawnSemaphoreclampedmaxviaMath.max(1, max), so the second subagent body in a batch always waited for the first to release the seat. The constructor now treatsmax <= 0(and any non-finite input) as unbounded viaNumber.POSITIVE_INFINITY, matching the evalparallel()/pipeline()worker-pool semantics (#3305).""and{}) totools/call; optional placeholders are now omitted while required fields and meaningful falsy values are preserved. (#3302)Tip:line rendering with hardcoded#b48cff/#​9ccfffpastels plus a manual\x1b[2mdim, so any light theme dropped the body to ~1.5:1 contrast (well under WCAG AA).renderWelcomeTipinpackages/coding-agent/src/modes/components/welcome.tsnow paints the label throughtheme.fg("customMessageLabel", …)and the body throughtheme.fg("muted", …)(no manual dim), so the line tracks the active theme and stays legible on light backgrounds. (#3337)omp usageand the/usagecommand duplicating provider-wide disclaimer notes (e.g. OpenCode Go's "OMP-observed spend only") once per account × limit window. Provider-level notes now render once above the per-account sections in the TUI, CLI, and ACP render paths, and identical per-limit notes are deduplicated in the TUI aggregate renderer. (#3268)? for keyboard shortcutsafter the?shortcut was deliberately removed (commitdcf482c). The tips section now points users at/hotkeysinstead. (#1614)defaultThinkingLevel: auto. Devin models advertisereasoning: truebut nothinking.efforts(Cascade selects effort by routing to sibling model ids, not a wire param), sogetSupportedEfforts(model)was empty;clampAutoThinkingEffortreturned the classifier-picked effort as-is, which then tripped `requireSupporteConfiguration
📅 Schedule: (in timezone UTC)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR has been generated by Mend Renovate.
Summary by cubic
Update core agent and tooling dependencies for stability and fixes. Bumps
@oh-my-pito 16.2.x and@sentry/clito 3.6.0; lockfile refreshes platform builds for@openai/codex.Dependencies
@oh-my-pi/pi-coding-agent:^16.1.13→^16.2.2(new tiny model role, SSH file ops, many reliability fixes)@oh-my-pi/pi-natives:^16.1.13→^16.2.2(compat with 16.2.x)@sentry/cli:^3.5.1→^3.6.0@openai/codexupdated to0.142.5Migration
search→grep,find→glob(settings auto-migrate, but check custom scripts/configs).Written for commit 312f991. Summary will update on new commits.