Repository navigation
chore: release v0.87.0 - #616
Open
stamp-build[bot] wants to merge 1 commit into
Open
stamp-build[bot] wants to merge 1 commit into
stamp-build[bot] wants to merge 1 commit into
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Minor release: manual compaction (
Session.compact(), added in 0.86.0) now also works on Grok, Qoder, Cursor and OpenCode v2 sessions. Compaction events gain the runtime's own operation identity, and a native frame can now say which OAR request it answers. ACP queues now record when OAR actually sends a held input, which changes the request records hosts see on Kimi, Grok, OpenCode, Antigravity and CodeBuddy. A host reacting synchronously to a turn ending can now send its next prompt right away on every runtime except Pi, unless OAR is still holding queued input.Manual compaction on more runtimes (#614)
activeTurn: "reject"): Grok, Qoder and Cursor declareRuntime.manualCompactionas supported.compact; OpenCode v1 sessions do not, because a project command can replace/compactand completion cannot be confirmed. OAR reads the version when the session opens (from the installation, or by runningopencode --version), so the shared OpenCodeRuntimestays undeclared: checksession.compactafter opening. Shared placement is v2-only and has it.compactonly when the SDK agent providessummarize()._x.ai/compact_conversationrequest iscompleted. Structured failure or cancellation errors givefailedoraborted; other RPC errors giverejected(runtime_refused); a null answer givesunconfirmedand frees the session. OAR reports nocompaction_startedfor Grok.startedlifecycle, a manualcompact_boundaryand completion, all for the same command UUID. Success without a boundary givesfailed(not_compacted); an error result givesfailed(native_failed); cancellation before a boundary givesaborted. A boundary already seen stayscompletedeven if the command later reports cancelled.Agent.summarize()returns a run id; that run's root summary and terminal result decide. A finished run without a terminal summary givesunconfirmedbut frees the session; a cancelled run without one givesaborted; an SDK refusal givesrejected(runtime_refused). A lost stream or rejectedrun.wait()givesunconfirmedand keeps the session reserved until the run ends ordispose(). Cursor SDK 1.2.0summarize()cannot passlocal.force, so it refuses a restored agent whose run is still marked active.messageId, plus the answer to the/compactprompt. An ordinary successful prompt is not proof. A native RPC error givesfailed(native_failed); an answer without matching markers givesunconfirmedand frees the session.unconfirmedand keeps the session reserved untildispose().completed(a native no-op), Qoderfailed/not_compacted, OpenCode v2failed/native_failed, Cursorrejected.queue()input is held and sent after it ends on Claude, Pi, Grok, Qoder, Cursor and OpenCode v2; Codex still refuses it asbusy.abort()uses the runtime's own cancel:session/cancelon Grok and OpenCode v2,run.cancel()on Cursor (an abort before the run exists cancels it oncesummarize()returns), and the interrupt on Qoder.Compaction events and new record fields (all optional and additive)
compaction_startedon itscompactingstatus, automatic compactions included. OpenCode v2 emitscompaction_startedandcompaction_endedfor every compaction, with the nativetrigger. Grok emitscompaction_endedfor manual compactions.compaction_started.compactionId?andcompaction_ended.compactionId?: the runtime's own identity for that compaction (currently only OpenCode v2'smessageId), present on automatic compactions too. It is not the envelope's turnspanId.compaction_ended.requestId?: set only when the native response explicitly answers that OARcompactrequest (currently Grok). Never inferred from timing.FrameBody.responseTo?: the id of the OAR request this native frame explicitly answers. Currently set on Grok and OpenCode v2 compact RPC answers, and on Qoder's terminalcommand_lifecyclewhosecommand_uuidis the id OAR sent. Exact equality only; it does not mean the request succeeded.compactrequests can carrysettledBy: "native_response"(Grok, OpenCode v2, Qoder): only a frame whoseresponseToequals that request id ends the operation. Earlierturn_endedorcompaction_endedevents stay in the stream but do not end it._x.ai/compact_conversationand_x.ai/compact_conversation/error. OpenCode v2 compact answers reusesession/promptandsession/prompt/error, but carryresponseToand noturn_ended.spanId: callback frames (child tasks too), stream frames with arun_id,cursor/run_result, and run failure frames. Root session and child-task attribution are unchanged.acceptedresponse carriesnative: { runId }.cursor/stream/summaryframes whose nativeagent_idis missing or is not the root session no longer carry compaction events, automatic summaries included.cursor/run_failedframe during an unresolved compaction carries noturn_ended.send()returns are recorded after it, keeping their originalreceivedAt, soreceivedAtis not always increasing.Behaviour change: ACP queue records (Kimi, Grok, OpenCode, Antigravity, CodeBuddy)
queue(), even on an idle session, now answersacceptedwithqueued: "adapter". When OAR sends it to the runtime, the stream gets a newpromptrequest whosecarriesnames that input; the queue request gets no second response. Before, an idle queue was sent at once with no prompt request.input,carriesandimages; readinputIdandoriginfrom the carried queue input. A queue with noinputIdis identified by its queue request id within the same record stream, and that fallback never links across a resumed stream.prompt()now returnsbusywhile OAR holds or is sending a queued input, not only during an active turn. A hostprompt({ carries: [heldId] })now returnsbusyinstead ofunsupported, and that attempt is added to the held input.running/waiting_modelinstead ofidle, until the dispatch prompt is accepted or awithdrawis accepted. If the dispatch is rejected, the input stays held.Bug fix: the next prompt can follow a turn end immediately
turn_endedcould seeidlebut still getbusy, and in Codex compaction the old cleanup could clear the turn the observer had just started. OAR now releases its own turn ownership before publishing the terminal frame:prompt()orqueue()from that observer cannot overtake input OAR is already holding.compact()the runtime refuses at dispatch releases its reservation before observers see that refusal restoreidle(every runtime withcompact()).turn_endedobserver there still getsbusy; send the next prompt after the callback returns.status()can showidlewhileprompt()returnsbusyto keep first-in, first-out order. These four do not yet record queue ownership the way ACP now does.Upgrade notes
rejectedoutcome can now come with anacceptedresponse. When the runtime refuses after accepting the dispatch (currently only Grok),outcome.kindisrejectedwhileoutcome.response.body.kindstaysaccepted; the refusal is in the correlated frame. Don't assume a rejected outcome has a rejected response.StatusState, as in 0.86.0. It now also holds the compaction identity learned from the first native manual start, the native settlement rule, and ACP held-queue ownership.SessionView.statusStatecan now appear outside compaction too.accepted.queued: "adapter",settledByandresponseTofrom any runtime built on the kernel SPI.RejectionCode,ControlAction,CompactionOutcomekinds and codes), and no exports changed.🤖 Generated with Claude Code