🐙
$ git clone https://github.com/can1357/oh-my-pi.git
@oh-my-pi/pi-agent-core
Fixed
- Provider-native compaction failures now surface their transport error instead of silently switching to generic summarization; streaming V2 still falls back to native V1 when available.
@oh-my-pi/pi-ai
Added
- Added first-class parentTurnId support for nested Codex requests, allowing stream options and metadata helpers to accept and safely propagate the initiating turn's ID.
- Added preservation of the Codex
encrypted_function_argsplaintext-collaboration marker on replayed function calls, keeping server-marked plaintext tool arguments from being reinterpreted as encrypted on subsequent turns. - Added interactive Exa API-key login through
/login exa, opening the official API-key dashboard and saving pasted keys to the credential store (). - Added interactive xAI API-key login with key validation through the xAI models endpoint.
- Fixed Google Gemini and Vertex tool declarations carrying numeric, boolean, object-valued, or mixed
enumarrays that the Google Schema wire type cannot represent. Unsupported enums are omitted while valid string enums remain constrained. - Umans usage provider: fetches
GET /v1/usageand surfaces the rolling 5h request window + concurrency limits in/usage,omp usage, and the TUI status bar. - Fixed ranged legacy Cursor reads reporting the returned window byte length as the full file size.
- Updated the Cursor client build advertisement to activate the modern exec-frame protocol handled by this provider.
- Fixed a windowed Cursor
readreporting the window's line count as the file's.total_linesandfile_sizewere derived from the payload, which is the whole file only for an unranged read — a 20-line page of a 100-line file answeredtotal_lines: 20, which a paginating server reads as the end of the file. The count now comes from the read's own record of the file (details.meta.truncation.totalLines), falling back to counting the payload when the read returned the file whole. - Fixed a
pi_grepthat hit the native backend's internal match ceiling answering as an unqualified success.GrepToolfolds that cap into the flatdetails.truncatedalone, setting neitherdetails.truncationnorperFileLimitReached— the two fields the Pi result was built from — so the one truncation a caller can neither detect nor page around was the one it was never told about. The flat flag is now translated into aPiTruncation, and only when no specific cap already reported itself. - Fixed a
pi_grepframe'scontextandlimitvanishing from the transcript. The bridge honors both by building a scopedgrep, but neither is expressible in the model-facing schema, so the synthesized block recorded a plain pattern/path search — replaying a context-widened or capped search as an ordinary grep sitting beside output no ordinary grep produces. Both are now recorded on the block. - Fixed a Cursor MCP resource listing shrinking to a count in the transcript. The full URI/name/mime catalog goes out on the wire, but the paired local result recorded
Listed N MCP resource(s)— and rebuilt history is serialized from that result, so one reload later the model knew it had seen N resources and could name none of them. The paired result now lists what the answer carried. - Fixed the
pi_readrange translation padding the slice it asks for.piReadPathcomposed a plain:N+Kselector, which the localreadtool expands by one leading and three trailing context line — so a frame naming offset 5/limit 20 received lines 4-27. Ranged Pi reads now compose:raw:N+K; the wire result is an opaque output string, so the line-number gutterrawalso drops carries nothing the contract needs. - Fixed four Cursor exec frames answering with a result whose oneof was never set. In proto3 that is not an empty result — the server reads it as "the tool ran and produced nothing", indistinguishable from real success.
listMcpResourcesExecResult,readMcpResourceExecResult,recordScreenResultandcomputerUseResultnow sendListMcpResourcesSuccess{resources: []},ReadMcpResourceNotFound{uri},RecordScreenFailureandComputerUseErrorrespectively. - The MCP resource frames now answer from the host instead of a fixed verdict.
CursorExecHandlersgainedlistMcpResources/readMcpResource, so a host holding live MCP connections advertises them; the empty catalog andnot_foundabove remain the answer when no handler is supplied. A handler that throws surfaces asListMcpResourcesError/ReadMcpResourceErrorrather than collapsing into "none exist", which the model cannot retry. A read carryingdownload_pathforwards it and answers withReadMcpResourceSuccess.download_pathand no content, which is what that mode means. - Fixed Cursor
connect_scmcalls losing their repository and settling on a fabricated verdict. The target rides in theConnectScmArgs.targetoneof, so reading a flatgithubproperty always sawundefined; and the authoritativesuccess/error/rejectedresult only arrives on the completion frame, so answering at the announcement persisted a fixed failure for every call — including the ones the server went on to accept. The block now opens on the start frame and settles from the completion's decoded result. - Fixed interleaved Cursor tool calls corrupting each other. The stream decoder tracked a single "current" block and settled it on any
toolCallCompleted, ignoring the envelope'scall_id: a completion for one call closed whichever block happened to be open and paired it with the wrong result, andstart A, start Borphaned A entirely so its own completion settled B while A was never paired — which strips the whole interaction from every rebuilt transcript. Open blocks are now retained per envelopecall_id, and end-of-stream closes all of them rather than only the last. - Fixed a Cursor
search_conversationscall leaving no transcript block. The frame is answered from a fixed verdict, so nothing downstream pairs a result for it, and an unpaired call takes its whole interaction out of every rebuilt transcript. - Fixed a Cursor
read_mcp_resourcecall leaving no transcript block. The frame runs locally — and in download mode writes a workspace file — but synthesized no tool call and paired no result, so the read was invisible in the UI and absent from every rebuilt history; a resource download could mutate the workspace with nothing on record. The frame now synthesizes aread_mcp_resourceblock (notread: it is a remote MCP operation, and the name drives rendering and prune semantics) and pairs a result on success, not-found and error alike. Frames answered without a handler still synthesize nothing, since nothing ran. - Fixed a Cursor
list_mcp_resourcescall leaving no transcript block. The model consumed the catalog, but the frame synthesized no tool call and paired no result — its streamedListMcpResourcesToolCallannouncement was equally unrecognized — so the listing was invisible in the UI and absent from every rebuilt history. Frames a handler answered now synthesize alist_mcp_resourcesblock and pair a result derived from the same answer that went on the wire; frames answered from the fixed no-handler catalog still synthesize nothing, since nothing ran. - Fixed an unavailable
pi_edit/pi_writeanswering with the error variant. Both results model refusal and failure as separate oneof cases, and a denial reported aserrorreads as "the tool ran and broke" — inviting a retry of an operation that was never permitted. A frame whose tool is not granted, or whose handler produced nothing, now answers withPiEditExecRejected/PiWriteExecRejected; execution failures keep the error variant. - Fixed a Cursor MCP approval probe actually running the tool. A modern
mcpArgsframe carryingsmart_mode_approval_onlyasks only whether a call would be permitted, not for the call itself. The decoder dropped the flag, so the frame ran a side-effecting MCP tool the user had not been asked about, then ran it again when the real call followed. The flag is now carried through and the probe is answered from the host's policy without executing: approved only for a definite allow, refused for a deny, for a mode that demands a prompt the frame cannot raise, and for a tool the session does not have. No transcript block is synthesized either, since nothing ran. - Fixed the Cursor stream's end-of-transport cleanup erasing the arguments of every block still open. Blocks whose args arrive whole (todo, connect-SCM, MCP) never feed the streamed partial-JSON buffer, and reparsing an absent buffer yields
{}, so a truncated or disconnected turn rebuilt those calls with no arguments at all. Only blocks that actually streamed their args are reparsed now. - Fixed a Cursor stream dying mid-turn stranding the call it left open.
connect_scmand native todo blocks are stamped resolved the moment they open, so the agent loop synthesizes no placeholder and only their completion frame pairs a result — a transport that closed first left the card animating and the call unpaired, which takes the whole interaction out of every rebuilt transcript. The terminal-error path now closes open blocks and pairs those server-owned calls with an interrupted result; the flush ran only on clean completion before, which is not the path a dying stream takes. Exec-settled MCP blocks are left alone, since the dispatch that ran them owns their result. - Fixed the Pi exec frames displaying a different operation than the one they run. The provider synthesized its transcript block from a second, hand-rolled translation of the frame args, so
pi_read'soffset/limitwere shown as a whole-file read,pi_grep'sliteralpattern as an unescaped regex, andpi_find's path/glob join differed from the executed one. Both sides now share a single translation. - Fixed the streamed
pi_*_tool_callannouncements that modern builds send alongside each exec frame being unrecognized. The exec channel already synthesizes those blocks when it runs the tool; the duplicate was avoided only because the decoder recognized none of the variants, which would have started double-rendering as soon as any one was added. - Fixed
pi_bashresults reaching Cursor clipped with no truncation notice. Two truncation records exist locally:read/grepsetdetails.truncation, which carries an explicittruncatedflag, whilebashsetsdetails.meta.truncation, whose record has no such flag — its presence is the signal.piTruncationread only the first shape and required the flag, so every real Bash truncation was dropped and the server was told the clipped output was complete. Both shapes now translate, and an explicittruncated: falsestill suppresses the field.
@oh-my-pi/pi-catalog
Added
- Regenerated the Cursor agent protobufs (
discovery/cursor-gen/agent_pb.ts) against the modernagent.proto, adding the message and enum families current Cursor CLI builds emit: Pi tool exec frames, hook queries and responses, subagents, allowlist prechecks, MCP state, smart-mode classification, canvas diagnostics, conversation search, agent-store conflicts and git diff. Purely additive — no existing exported symbol changed shape.
Fixed
- Fixed an issue where LM Studio first turns failed with a 400 Invalid tool_choice error when a named tool was forced, by using the supported tool_choice: "required" string selector.
@oh-my-pi/pi-coding-agent
Breaking Changes
- Removed the
DEL,DEL.BLK,COPY, andCOPY.BLKhashline edit operations. UseCUT/CUT.BLKfor deletion; removed content remains available toPASTE.
Added
- Added server-name autocomplete for
/mcpcommands (enable,disable,test,remove,reconnect,reauth,unauth) using configured and runtime-discovered MCP servers. - Added
CUTandPASTEops to the hashline edit tool for moving code without retyping it:CUT N.=M(and.BLKblock forms) capture lines into a clipboard register, andPASTEoperations insert them. The register flows across sections within a patch (cross-file moves) and persists across edit calls per session. - Added
--from-claudeand--from-codexsession imports (including compaction state for Codex), also available from/resume @claudeand/resume @codex. - Added interactive Exa API-key onboarding through
/login exa, opening the official key dashboard and saving pasted keys for authenticated web search while preservingEXA_API_KEYand explicit-selection public MCP fallback behavior ( by ).
Fixed
- Fixed Anthropic prompt-cache cold misses on session resume with multiple OAuth accounts: the account that served a session is now recorded in the session file (as a
credential_pinsha-256 of the account + org/project scope, so exports carry no plaintext identity) and re-pinned on resume with the session's effective last-use time, so a fresh process no longer re-ranks accounts by usage headroom — which systematically routed away from the just-used account and cold-missed the entire account-scoped cache prefix. Sticky routing was previously stored only in the auth store's KV cache, which is in-memory when a remote auth broker is configured. - Fixed Anthropic prompt-cache cold misses on session resume with multiple OAuth accounts: the account that served a session is now recorded in the session file (as a PII-free
credential_pinhash) and re-pinned on resume, so a fresh process no longer re-ranks accounts by usage headroom — which systematically routed away from the just-used account and cold-missed the entire account-scoped cache prefix. Sticky routing was previously stored only in the auth store's KV cache, which is in-memory when a remote auth broker is configured. - Fixed concurrent
createAgentSessioncalls with the default agent id failing initialization withAgent "Main" was replaced during session initialization— each in-process embedder (e.g. the edit benchmark runner) can now pass a private registry via the newly exportedAgentRegistry, keeping every top-level session's "Main" out of the process-global roster race. - Fixed task tool blocks duplicating their per-agent progress rows into terminal scrollback on every update: live task frames now pin the transcript live region so mid-run rows are never recorded as frozen snapshots, and a detached background task freezes its progress the moment any of its rows commit to scrollback instead of mutating committed history.
- Fixed Codex reset fireworks comparing different quota tiers or plans, preventing false celebrations when usage reports switch between Spark and base weekly limits.
- Fixed Cursor ranged-read results losing the full file byte size after applying the requested window.
- Fixed empty Codex final-stop recovery discarding an earlier commentary message when both messages shared response metadata.
- Fixed Advisor availability with providers that refuse echoed reasoning by retrying once with primary thinking stripped and surfacing persistent refusals immediately.
- Fixed
/tanagents being unable to read parent-sessionlocal://attachments by correctly resolving local protocol options against the parent session's artifacts. - Fixed Codex web search silently returning plain completions when the hosted web search tool was skipped.
- Fixed TUI collaboration guest loader not starting when joining or reconnecting mid-turn.
- Fixed multi-second TUI freezes in reftable-format repositories by moving branch resolution off the render path and adding a timeout to synchronous git spawns.
- Fixed
xd://device summaries containing control characters and exceeding size budgets by stripping control characters and bounding summaries by UTF-8 bytes. - Fixed
task.softRequestBudgetconfiguration having no effect on bundled scout and sonic subagents. - Fixed quick LSP server exits being misreported as reader failures and resolved an issue where explicit reloads were blocked by initialization backoff.
- Forced Git subprocesses to use the stable
Clocale to ensure predictable, non-interactive command output. - Fixed compatibility replay issues for pre-upgrade launch brokers evaluating xterm inside the client process.
- Fixed Advisor cost tracking in the status line across conversation boundaries, ensuring session transitions, forks, and resumes correctly restore or isolate conversation spend.
- Fixed validation failures for legacy extensions importing from the package root, which previously blocked installations.
- Fixed ACP clients (such as Zed), TUI status lines, and collaboration guests not updating when model changes occur dynamically within the agent loop.
- Fixed assistant-facing resource summaries omitting parameterized MCP resource templates, ensuring failed reads list templates alongside concrete resources.
- Fixed redundant
xd://mount notices and prompt-cache invalidation when resuming sessions or reconnecting devices. - Fixed the model picker displaying placeholder model lists instead of the actual credential-aware catalog resolved at registration.
- Fixed file corruption and snapshot mismatches when writing files through the ACP client bridge by verifying the final on-disk content after client-side post-save formatting.
- Fixed
omp ttsr testsilently evaluating source files as prose when their extensions were missing from the allowlist, and expanded the allowlist to support .NET, Shell, SQL, Zig, Dart, Scala, Elixir, and Protobuf files. - Fixed automatic light/dark theme switching in direct WezTerm sessions on macOS when DEC Mode 2031 is unsupported, and improved theme-change color responsiveness.
- Fixed configured
retry.maxDelayMsnot being forwarded into Anthropic retry handling, so over-budget server retry delays fail fast. - Added tokens-per-second throughput to RPC
get_stateresponses for non-TUI clients. - Added the RPC
set_fast_modecommand and typed TypeScript/Python client methods for live fast-mode control. - Added
fastModeEnabledandfastModeActiveto RPCget_stateresponses. - Fixed RPC fast-mode state reporting after direct Anthropic rejects
speed: "fast", while allowing explicit re-enable requests to retry priority service. - Added opt-in subagent access to
checkpoint,rewind,learn, andmanage_skillwhen explicitly listed in an agent definition'stools:frontmatter. Listing one ofcheckpoint/rewindauto-includes the other. Settings (checkpoint.enabled,autolearn.enabled) remain master toggles. - Added a
browser.cdpUrlsetting that points browser automation at an already-running CDP endpoint by default, soapp.cdp_urlno longer has to be repeated on every call. Explicitappoptions still take precedence. - Native compaction preserves provider-native success and non-authentication failure semantics while retaining authenticated cross-provider fallback when the native provider rejects credentials.
- Fixed the Cursor Pi exec bridge silently dropping frame arguments.
pi_read'soffset/limitwere ignored, so a ranged read returned the whole file;pi_grep'sliteralwas ignored, so a fixed-string search ran as a regex and matched the wrong lines; and the path/glob join produced a./-prefixed spec. Ranges are now composed ontoread's:N+Kinline selector, literal patterns are escaped, and the join usesnode:path. These areoptional int32fields, so a present0is honored rather than folded into a default:pi_readwithlimit: 0answers with empty output instead of the entire file, andpi_findwithlimit: 0clamps to 1 the way the reference client does. pi_grep'scontextandlimitare honored. Neither is expressible in the model-facinggrepschema — context width comes fromgrep.contextBefore/grep.contextAfterfixed at tool construction — so the bridge builds a per-callgrepfor frames that supply them.GrepToolaccepts these as constructor options; the model-facing schema is unchanged, and a frame that supplies neither keeps the shared instance and the session's defaults.pi_ls'slimitis still not mapped, now deliberately: it caps directory entries, while the localreadtool renders a depth-2 tree with per-directory caps and elision rows and applies a selector as a rendered line slice. Mapping it to:1+Kwould cap a different unit while appearing honored.- The legacy pi shim's regex-literal escaper and path/glob join were verbatim copies of the modern bridge's. Both paths now call the shared helpers, so the two Pi translations cannot drift.
- Fixed every Cursor
pi_editframe failing instead of editing. Two independent causes: the session dropseditfrom the tool registry for Cursor so the model uses full-filewrite, but that registry is also the exec bridge's tool source, so the native frame — which the server sends regardless of the advertised catalog — found no tool; and the retained instance followed the session's configured edit mode, whilePiEditExecArgscarriesold_text/new_textpairs that onlyreplaceaccepts (the defaulthashlinetakes a singleinputstring). The bridge now resolves areplace-mode instance through its fallback resolver, still wrapped for approval. - Fixed a
pi_grepframe carryingcontextorlimitescaping the approval gate. Honoring those fields needs a per-callgrep, and the per-call instance was built raw while every registry tool is wrapped, so such calls bypassedtools.approval.grepand the exec-tier check for SSH-targeted paths. Both bridge callsites now build it through one shared factory that applies the same wrapper. - Fixed Cursor advisors ignoring
pi_grep'scontextandlimit. Only the primary session supplied the per-callgrepfactory, so advisor frames silently fell back to session defaults. Advisors now receive the same factory, gated on the advisor actually having been grantedgrep. - Fixed Cursor advisors failing every
pi_edit. The advisor roster handed the bridge theeditinstance built for the advisor's own loop, which follows the configurededit.mode(hashlineby default) and rejects the frame'sold_text/new_textpairs — the same mode mismatch the primary bridge already fixed, on the path it missed. The exec map now substitutes areplace-mode instance, gated on the advisor actually having been grantededit, while the advisor's own loop keeps the tool it was given. - Fixed
pi_bashkilling commands that explicitly asked for no deadline.timeoutisoptional int32andbashdocuments0as "disables the command deadline", but a truthiness check folded a supplied0into unset, applying the 300s default instead. A present0now passes through; negatives, which have no local meaning and would otherwise clamp to the 1s floor, still fall back to the default. - Fixed the Cursor exec bridge granting
editandgrepto sessions that withheld them. Both bridge-only tools are constructed rather than looked up, andexecuteToolprefers a constructed override over the registry, so a restricted tool set (toolNameswithout them, orrestrictToolNames) still got a workingpi_edit/pi_grep— native frames arrive regardless of the advertised catalog. Both are now gated on the session having actually granted the tool, matching thedeleteframe's existing check (issue in in in in in in in in in in in in in in in in in made their first contribution in made their first contribution in made their first contribution in made their first contribution in made their first contribution in made their first contribution in made their first contribution in
Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf github.com.
Wie bewertest du diesen Beitrag?
1 Klick Feedback Teilen mit Netzwerk & Team:
Hat Ihnen dieser Tipp / Anleitung geholfen?
Community-Analysen & Experten-Meinungen 0
Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf „ Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum 🔴 Akute Relevanz 41%
🟡 In Evaluierung 23%
🟢 Keine Auswirkung 13%
Spannende Innovation 23%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Tipp: Mit Pfeiltasten [ ← ] und [ → ] blättern
SOCIAL SHARE CARD GENERATOR