@oh-my-pi/pi-agent-core
Added
- Added
approvalsupport toAgentTooldeclarations with the newToolTierandToolApprovalAPIs, allowing tools to declare capability tiers (read,write, orexec) and optional override/reason metadata for approval gating - Added
formatApprovalDetailsonAgentToolto append custom detail text or lines to approval prompts - Added exported
ToolTierandToolApprovaltype aliases for tool approval declarations
Fixed
- Fixed chat-request telemetry storing the raw scoped
serviceTiervalue ("openai-only"/"claude-only") inOpenAIAttr.RequestServiceTierinstead of the resolved wire value ("priority"). Dashboards and alerts filtering on the concrete tier name (service_tier == "priority") were broken by the scoped placeholder;buildChatRequestAttributesnow runs the tier throughresolveServiceTier(serviceTier, provider)before recording, keeping theshouldSendServiceTiergate intact so non-OpenAI providers continue to omit the attribute entirely.
@oh-my-pi/pi-ai
Added
- Added
zhipu-coding-planprovider for Zhipu (智谱) BigModel's domestic coding-plan SKU athttps://open.bigmodel.cn/api/coding/paas/v4, with dynamic model discovery (ZHIPU_API_KEY), zai-format thinking,reasoning_contentfield, and OAuth login flow (#1340).
Removed
- Removed the
pi-aiCLI binary (packages/ai/src/cli.ts) and itsbinentry. Use the in-process equivalent in the omp coding-agent CLI:omp auth-broker login [provider],omp auth-broker logout [provider], andomp auth-broker list. The library API (AuthStorage.login(),getOAuthProviders(), etc.) is unchanged.
Fixed
- Fixed delayed
toolResultemissions so real tool results are emitted in the correct assistanttoolCallwindow after handoff/compaction, preventing out-of-order or orphaned tool results - Fixed delayed
toolResulthandling for aborted calls so a late real result is emitted instead of a syntheticabortedresult for the sametoolCallId - Fixed usage polling to disable credentials when OAuth refresh fails definitively (for example
invalid_grant) and clear cached last-good usage data so stale reports no longer remain visible
@oh-my-pi/pi-coding-agent
Added
- Added per-tool approval declarations so each built-in, custom, or extension tool can declare its capability tier and approval prompt details.
- Added
OMP_MCP_TIMEOUT_MSenvironment variable to override MCP client request timeout for every server (in milliseconds); set to0to disable client-side timeouts. Invalid (negative or non-numeric) values are ignored with a warning and fall back to the per-server timeout or default 30s (#1415). - Added
omp auth-broker list(with--jsonfor machine-readable output) to enumerate supported OAuth providers, replacingbunx @oh-my-pi/pi-ai list. - Added interactive provider selection to
omp auth-broker loginandomp auth-broker logoutwhen invoked without a provider argument (replacing the equivalentbunx @oh-my-pi/pi-ai login/logoutflows). The logout picker is sourced from stored credentials so it only lists providers the user is actually signed in to. - Added directory matches to the
findtool: glob searches now return directories alongside files, with directory hits emitted with a trailing/marker.findfor**/testsno longer requires a follow-upreadto surface a directory hit; tool prompt and output docs were updated to reflect that paths may be either kind. - Added the RFC 8414 §3.1 path-ful issuer form (
/.well-known/oauth-authorization-server<issuer-path>) as a third candidate in MCP OAuth discovery, after origin-root and path-prefixed well-known URLs, so deployments that publish authorization-server metadata at the path-ful location resolve correctly. Single-segment authorization URLs (e.g.https://gateway/my-service) are now treated as the gateway prefix instead of being dropped back to the origin root.
Changed
- Changed tool-approval prompts to use an explicit
Approve/Denyselector and surface the denial reason as contextual help text instead of a bare confirm/cancel toggle. - Changed approval safety overrides to prompt even in
yolo/--auto-approvesessions, so critical tool-declared patterns no longer run unattended. - Changed
omp auth-broker loginto drive the per-provider OAuth/API-key flow in-process viaAuthStorage.login()instead of spawning thepi-aiCLI subprocess. Thepi-aibin is being removed; the same login surface now lives entirely insideomp. - Changed the default per-line truncation cap for search/grep output (
DEFAULT_MAX_COLUMN) from1024to512characters to keep wide minified single-line bundles from blowing out the model's context. - Changed
edit.hashlineAutoDropPureInsertDuplicatesto also fire onA-B:payloadreplacement ops when a single non-structural boundary payload line duplicates the line immediately above the deleted range (prefix) or immediately below it (suffix). Catches the common mistake ofA-B:foowhere the user meantA-B!but typed a payload that happens to match adjacent context. The existing 2+-line block absorb and balance-validated structural single-line absorb already covered the multi-line and structural-delimiter cases; this closes the single-line non-structural gap.
Fixed
- Fixed the agent loop and bash executor busy-spinning when scheduler waits returned early. napi
uv_async_sendcallbacks can wake the event loop after only ~1–2 ms even when the caller asked for a longer sleep, soyieldIfDue()now compensates by retryingBun.sleep()until the requested wall-clock duration has elapsed, and the bash executor wraps itsrunPromise/timeout/abort race in anExponentialYield(20 ms → 10 s) so long-running commands stop hot-looping on the race. Yields are additionally throttled by a module-level 50 ms gate, and losing timers in the race are aborted viaAbortSignalso they don't keep firing after a winner is selected (#1396 by @hezhiyang2000, closes #1384). - Fixed streaming edit previews going blank for inline-payload ops.
LINE↓payload/A-B:payloadare valid single-line writes, but the natural-order preview was skipping the entire op token until a newline arrived — so the first character the model typed after the sigil only appeared after the next line ended, and the renderer would fall back to rendering the rawA-B: bla bla blainput. Inline-body content onop-insertandop-replacetokens is now emitted as a+payloadline on the same op tick. - Fixed
/usageand the status-line reset countdown rendering stale negative deltas after a Codex window had elapsed: Codex keeps reporting the prior window'sreset_atuntil a new request opens a fresh window, which turned theresets in …suffix into a meaningless negative duration.formatDurationnow clamps non-positive, NaN, and infinite inputs to0ms, and both renderers suppress theresets in …suffix entirely onceresetsAt <= now. - Fixed auto-handoff race at the context threshold: when
compaction.strategy = handofffired atagent_endwith an active checkpoint or incomplete todos, the deferred handoff post-prompt task and the rewind/todo-completion path both scheduled work concurrently, so a freshagent.continue()streamed a new assistant turn alongside the handoff LLM call (visible as the "Auto-handoff" loader plus an assistant message still streaming, with the chat container then rebuilt mid-stream).#checkCompactionnow reports whether it deferred a handoff and theagent_endhandler short-circuits the rewind/todo passes;#scheduleAgentContinuealso skips whenisCompacting || isGeneratingHandoff. The pre-prompt#checkCompactioncall now forces inline execution (allowDefer = false) so the new turn cannot begin until the maintenance settles. - Fixed
/exitand Ctrl+C-double-tap hanging when a deferred handoff was mid-flight:AgentSession.dispose()now aborts retry/compaction (auto-compaction + handoff) and the agent stream before draining#cancelPostPromptTasks, so the post-prompt task awaitinggenerateHandoffrejects andPromise.allSettledcan resolve. Tool work (bash/eval/python) is intentionally still left for the existing dispose paths so shared kernels continue to survive across session dispose.
@oh-my-pi/pi-natives
Fixed
- Fixed bash heredocs (
<<) and here-strings (<<<) deadlocking the shell on Windows past ~4 KiB and on macOS past 16-64 KiB.brush_core::interp::setup_open_file_with_contentswrote the entire body into an anonymous pipe synchronously before handing the reader to the next command; once the body exceeded the OS pipe buffer the writer blocked forever and thebashtool timed out at the hard 305 s ceiling without ever launching the consumer. The Linux fast path still usesF_SETPIPE_SZto grow the pipe in-place; every other OS-threaded platform (and Linux bodies abovepipe-max-size) now decouples the write onto a fire-and-forget thread that terminates naturally on drain orBrokenPipe; no-thread targets keep the upstream synchronous path so heredocs do not fail at thread spawn.
@oh-my-pi/pi-tui
Fixed
- Fixed
@file mention autocomplete stalling for seconds when the query references something outside the project root (e.g.@../,@~/,@/abs/).CombinedAutocompleteProvidernow short-circuits to plain immediate-directory prefix listing in those cases instead of dispatching a recursivefuzzyFindwalk over a sibling directory full of unrelated projects. Inside-cwd queries keep the existing fuzzy-then-prefix behavior. (#1395) - Gated the Hangul Compatibility Jamo width correction (U+3131..U+318E → 1 cell, originally landed in 15.0.1 for the IME / hardware-cursor displacement bug) behind
process.platform === "darwin"in the TS path andcfg!(target_os = "macos")in thepi-nativesRust path. macOS terminals (Ghostty / Terminal.app / iTerm2) render jamo as 1 cell despite UAX#11 classifying them as Wide, but WezTerm and most Linux terminals honor UAX#11 and render them as 2 cells. The unconditional correction therefore desynced the TUI's column bookkeeping from the terminal's actual rendering off-darwin, producing corrupted layout and broken Korean input on Linux. On non-darwin the helpers now defer entirely toBun.stringWidth/UnicodeWidthStr(also a small perf win on the multi-char-grapheme path). (#1410)
What's Changed
- fix(providers): discover Google Vertex project models by @roboomp in #1413
- feat(coding-agent): support OAuth discovery for path-prefixed auth servers behind gateways by @faizhasim in #1407
- fix(pi-shell): unblock bash heredocs >4 KiB on Windows and >64 KiB on macOS by @oldschoola in #1325
- fix(ai): strip multipleOf from Cloud Code Assist tool schemas by @hanbinnoh in #1405
- fix(coding-agent/lsp): accept $-prefixed identifiers; apply documentChanges in declared order by @oldschoola in #1389
- feat(coding-agent): surface resolved subagent model badge in task widget by @justadudewithtime in #1398
- fix(coding-agent): browser/patch/mcp/find/DAP review fixes by @oldschoola in #1388
- Allow disabling MCP client timeouts by @omsrisrieternalradhakrsna in #1415
- fix(tui): apply Hangul jamo width correction only on macOS by @hanbinnoh in #1410
- fix(tui): progressive enhancement keyboard negotiation for Zellij by @nikzasel in #1406
- fix: prevent busy-wait in agent loop and bash executor by @hezhiyang2000 in #1396
- follow-up to 5e444d9: firepass help/breadcrumb + AI/telemetry fixes by @oldschoola in #1387
- Fix /review custom instructions submission by @superhedge22 in #1374
- feat(ai): add zhipu-coding-plan provider for domestic Zhipu BigModel API by @sparkzky in #1390
- feat(coding-agent): restore per-tool approval policies by @oldschoola in #1378
New Contributors
- @faizhasim made their first contribution in #1407
- @justadudewithtime made their first contribution in #1398
- @omsrisrieternalradhakrsna made their first contribution in #1415
- @nikzasel made their first contribution in #1406
- @hezhiyang2000 made their first contribution in #1396
- @superhedge22 made their first contribution in #1374
- @sparkzky made their first contribution in #1390
Full Changelog: v15.4.3...v15.5.0