@oh-my-pi/pi-agent-core
Breaking Changes
- Removed
compaction/index.tsre-export of snapcompact helpers, so snapcompact utilities are no longer available from the agent compaction barrel and should be imported from@oh-my-pi/snapcompact - Removed the
convertToLlmalias export fromcompaction/messages— it duplicateddefaultConvertToLlmunder a second name. ImportdefaultConvertToLlm(array form) or the newconvertMessageToLlm(single-message form) instead
Added
- Added
convertMessageToLlm(): the single-message core transformer behinddefaultConvertToLlm(). Embedders with app-specific message roles should handle their own roles and delegate every core role (user/developer/assistant/toolResult/custom/hookMessage/branchSummary/compactionSummary) to it instead of duplicating the conversion — a duplicatedcompactionSummarycase is how snapcompact frames once silently dropped off provider requests - Added
pruneSupersededToolResults()and the opt-inPruneConfig.supersedeKeyhook so harnesses can prune stale tool results superseded by a newer read of the same file; superseded results are pruned ahead of age-based victims during overflow pruning and replaced with a[Superseded by a newer read of this file]placeholder. Without the new config,pruneToolOutputs()behavior is unchanged. - Added
readToolSupersedeKey()implementing the read-tool path/selector grammar (selector-free reads supersede range reads of the same file; URL-scheme paths exempt). Pruning honors prompt-cache economics: per-turn prunes only fire when the post-candidate suffix is small or the cache is cold (idle gap). - Added the
snapcompactcompaction strategy via@oh-my-pi/snapcompact: instead of an LLM summary, discarded history is printed onto dense bitmap frames and re-attached to the compaction summary message as image blocks.CompactionSummaryMessagegains an optionalimagesfield,estimateTokens()charges per attached frame, and frames persist underpreserveData.snapcompactwith an 8-frame middle-out eviction budget. - Snapcompact frames are now rendered in a provider-aware shape (
SNAPCOMPACT_SHAPES+resolveSnapcompactShape(api)), following the snapcompact 200k-token monolithic evals: Anthropic-family and unknown APIs get8x8r-bw(unscii-8 square cells, black ink, every line printed twice with the copy on a pale highlight band — read at F1 parity with raw text at ~2x lower cost and the most refusal-robust), Google gets8x8r-sent(sentence-hue ink, ~2.9x cheaper), and OpenAI gets6x6u-sent(unscii Lanczos-stretched to 6x6 cells — OpenAI bills a flat ~2.9k tokens per image, so frame count is the only cost lever) withdetail: "original"on the frame images.snapcompactCompact()acceptsmodel/shapeoptions, frames persist their shape metadata, mixed-shape archives (provider switches, legacy 5x8 frames) are flagged in the reading instructions, andsnapcompactGeometry()/renderSnapcompactFrame()now take a shape
Changed
- Compaction and branch-summary file lists are now a single
<files>tag instead of<read-files>/<modified-files>: paths render as the grouped, prefix-folded directory tree the find/search tools emit (# dir/headers, bare basenames), each annotated(Read),(Write), or(RW)— modified files that were also read get(RW). Legacy tags in summaries written by earlier versions are still stripped and self-heal on the next compaction
Fixed
- Fixed queued steering messages being drained into an externally aborted run: interrupting mid-tool execution (e.g. Enter with a pending steer) dequeued the steer into the dying run — it landed in history without a response and the post-abort resume saw an empty queue, so the agent stopped instead of continuing. Steering/follow-up/aside queue polls are now skipped once the run's abort signal fires, leaving the queue intact for
Agent.continue(). - Fixed
<read-files>compaction lists recording the same file once per line-range/raw selector (src/foo.ts:50-200,:raw,:1-50:raw, …): read-tool selectors are now stripped before tracking, so reads dedupe to the base path and match their write/edit path when splitting read-only vs modified lists. Selector-polluted lists stored by earlier compactions self-heal on the next compaction.readToolSupersedeKey()now shares the same splitter (splitReadSelector()), gaining the..range alias andL-prefix forms it previously missed. - Fixed
estimateTokens()undercounting thinking-heavy assistant messages on replay:thinkingSignaturepayloads (OpenAI Responses encrypted reasoning items, Anthropic signed thinking blocks, etc.) andredactedThinking.dataare now charged alongside the visible thinking text, so the local estimate tracks provider-reported usage instead of straddling the threshold on every turn () - Hardened strict tool-schema handling beyond the optional-union case:
enforceStrictSchemanow splices natively nested pure unions into the parentanyOf(only when the inner node carries no constraining siblings, since sibling keywords are conjunctive withanyOf), so source schemas with nested unions no longer produce type-lessanyOfbranches that strict upstream validators reject. () - Cross-model
anthropic-messages → anthropic-messagescontinuations now preserve prior assistant turns' reasoning chains end-to-end: every priorthinking/redactedThinkingblock survives (not just the latest surviving assistant), and third-party ↔ third-party replays keep their signatures intact so the reasoning chain stays signed for the next turn. Signatures are stripped (and anyredacted_thinkingsibling without a native landing spot is dropped) only when an official Anthropic endpoint is on either end of the replay — official Anthropic cryptographically binds reasoning signatures to its key+session+model, while compatible reasoning endpoints (Z.AI, DeepSeek, custom anthropic-messages providers configured viamodels.yaml) treat them as opaque continuation hints. Source-side official detection uses the canonical catalog provider id"anthropic"(assistant messages carry nobaseUrl); target-side detection reuses the bakedcompat.officialEndpointflag. Latest-turn byte-for-byte behavior (Anthropic's "thinking blocks in the latest assistant message cannot be modified" rule) and existing aborted/errored last-block sanitization are unchanged. ()
@oh-my-pi/pi-catalog
Fixed
- Fixed
buildModelso malformed explicit thinking metadata withouteffortsis treated as sparse input and inferred instead of crashing during model resolution (). - Fixed
tab.screenshot({ save })ignoring the save path's extension: an explicit.webp/.jpgdestination received hardcoded PNG bytes behind a mismatched name. The full-res capture format is now derived from the save path (png/jpeg/webp, puppeteer-native), and the reported mime type follows the bytes actually written; unknown or missing extensions still capture PNG - Fixed an infinite
compaction.strategy: shakeauto-continue loop in thinking-heavy sessions: the post-shake check now uses the provider-anchored trigger metric (instead of a local estimate that undercountsthinkingSignaturepayloads) and only treats pressure as resolved when residual context lands inside an 80% recovery band, so shake reliably falls back to context-full compaction when it cannot create real headroom ( in in in in in↗ Original-Artikel auf github.com lesenVollständiger Original-BerichtAusführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf github.com.
Community-Analysen & Experten-Meinungen 0
Verwandte Story-Cluster & Quellen (Vektor-KI)
Ähnliche Beiträge
Auch interessante Nachrichten v15.11.0
Thematisch verwandte Begriffe: v15110 · 6 Treffer
KB5121003 Spieleabstürze durch RGB-Treiber beheben - WindowsPower.de
[webapps] Langflow 1.10.0 - RCE
[webapps] Marimo 0.20.4 - RCE
Videos werden geladen ...
Beiträge werden geladen ...
Videos werden geladen ...
SOCIAL SHARE CARD GENERATOR