From 1f815423ccbf502313b6a0e09325b95a8abb5444 Mon Sep 17 00:00:00 2001 From: Yuanhao Li Date: Tue, 20 Oct 2026 19:22:38 +0200 Subject: [PATCH] release: yoagent 0.25.11, yoagent-rutis 0.7.1 Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01T7iq5hpndSiHQcnAsywKuG --- CHANGELOG.md | 8 +++++--- Cargo.toml | 2 +- integrations/yoagent-rutis/Cargo.toml | 2 +- skills/yoagent/SKILL.md | 13 ++++++++++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2683b52..75bd8e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,15 @@ All notable changes to `yoagent` are documented here. The format loosely follows [Keep a Changelog](https://keepachangelog.com/), and the project adheres to [Semantic Versioning](https://semver.org/). -## Unreleased +## 0.25.11 (2026-10-20) + +A fix; no API change. - **A tool result's line budget covers all its text blocks.** `tool_output_max_lines` was applied to each text block on its own, so since 0.25.9 sent every block (#347; Bedrock, and results with an image, sent them before) a result of N blocks could reach the model as N × the budget — 50 blocks from an MCP server, 10,000 lines where 200 were meant. The budget is now the result's: blocks no longer than an even share stay whole, the others split what is left (the remainder to the earliest), each cut head + tail with its own marker and stash key as before. A block not left whole keeps at least 5 lines (head, marker, tail; a shorter one stays whole), so when the even share would be under 5 lines — more text blocks than a fifth of the budget — the result goes over the budget by up to 5 lines per such block, never cut without a marker. Below a budget of 5 there is no room for a marker and nothing is shared: each block keeps the budget, as before. One-block results are unchanged, and truncation stays idempotent, so history written by this version is never rewritten. A multi-block result stored by an earlier version that is over the budget in total is cut once more, the first time compaction's level 1 runs over it: one prefix-cache rewrite. A stash key its old markers name may be cut out of the context then (the stash entry itself is kept), and that cut's own marker names no key: compaction does not stash. -## yoagent-rutis Unreleased +## yoagent-rutis 0.7.1 (2026-10-20) -yoagent-rutis only; requires yoagent 0.25, rutis 0.12 and Rust 1.88, as 0.7.0. Additive. +yoagent-rutis only; requires yoagent 0.25, rutis 0.12 and Rust 1.88, as 0.7.0. Additive: new pi adapter settings `model`, `models` and `execFor`, pi observer events, the opt-in DSH host and `adapters::dsh_host_rows`. - **pi adapter: models and per-extension `exec` grants.** `ctx.model` and `ctx.modelRegistry` were always `undefined`, so extensions that read them threw (pi-background-tasks in `session_start`). New settings `model` and `models` (`{provider, id, name?, contextWindow?, maxTokens?, reasoning?, input?}`) give them in pi's `Model` shape, without `model` the model id of the run's latest request under provider `yoagent` (`undefined` before the first request, so an extension that needs a model in `session_start` — pi-background-tasks — needs the host to set `model`); the registry is read-only (`getAll`, `getAvailable`, `find`, the `*OfType` lookups, a no-op `refresh`, …) — credentials, model calls and provider registration throw "not available in yoagent". New setting `execFor` grants `pi.exec` per extension file over the row-wide `exec` (a key naming no loaded extension refuses the load). Asked for by yobuild. - **DSH host fixes** (after #356): runs a sub-agent delegates to at any depth join the top-level run's DSH turn (a grandchild under a child that made no DSH call opened a turn of its own and closed the top-level run's — every run that carries the bridge, as its own extension or a parent's tree extension, now tells the host who delegated it, from the adapter's `tools` and `before_model` hooks); a failed run's turn ends with the run's error (and the extension that failed it), not a generic message; approvals ask "Allow once" / "Deny" instead of a confirm, since a host's confirm answers `false` for no answer too and DSH recorded it as a rejection — no answer is now `unavailable`; a cancelled call stops waiting for its stand-in while queued; the log flush after a turn no longer holds up `finish` (which yoagent bounds at 5 s); `runMaintenance` is documented as running its task at once. Every step of the stand-in's queue is bounded (a timeout names the step), a generation's late flush is skipped once it is torn down, and a host answering an approval with neither option is logged. Tests read the session logs back from disk (turns and the approvals' audit pairs), check each approval outcome by its text — with the scripted UI answering an unanswered confirm `false`, as yobuild does — and that a grandchild's call reached the host. diff --git a/Cargo.toml b/Cargo.toml index 1d54246..ea81ca1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yoagent" -version = "0.25.10" +version = "0.25.11" edition = "2021" # MSRV-aware dependency resolution (cargo 1.84+): prefer dependency versions # whose own rust-version fits ours. Without it CI re-resolves to whatever is diff --git a/integrations/yoagent-rutis/Cargo.toml b/integrations/yoagent-rutis/Cargo.toml index 858aa62..66ba2f8 100644 --- a/integrations/yoagent-rutis/Cargo.toml +++ b/integrations/yoagent-rutis/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yoagent-rutis" -version = "0.7.0" +version = "0.7.1" edition = "2021" resolver = "3" description = "Extend yoagent agents at runtime with rutis plugins, as one yoagent Extension: tools, tool policy, output filters, turn notes, input checks, verifiers and events" diff --git a/skills/yoagent/SKILL.md b/skills/yoagent/SKILL.md index 12f376c..86c43b5 100644 --- a/skills/yoagent/SKILL.md +++ b/skills/yoagent/SKILL.md @@ -5,7 +5,7 @@ description: Use when building, extending or upgrading an agent on the yoagent R # yoagent: which feature for which job -Written for **yoagent 0.25.10** (and yoagent-rutis 0.7.0); the recipes +Written for **yoagent 0.25.11** (and yoagent-rutis 0.7.1); the recipes below are compiled by `tests/skill_test.rs`, line for line. Check what you build against: `cargo tree -p yoagent` or `Cargo.lock`. If you are on an older version, read [What changed](#what-changed) first. @@ -198,6 +198,11 @@ and its examples. Newest first; the full list is `CHANGELOG.md`. +- **0.25.11** — `tool_output_max_lines` is one budget per tool result, + shared by its text blocks (a many-block MCP result reached the model as + blocks × the budget): short blocks stay whole, long ones split the rest, + each cut with its own marker and stash key. Older multi-block results + over the budget are cut once more at their first level-1 compaction. - **0.25.10** — `ModelConfig::presets()` / `preset(provider, id)` / `generic(provider, id)`: for a model given as text, write `preset(p, id).or_else(|| generic(p, id))` and tell the user when the @@ -264,6 +269,12 @@ Newest first; the full list is `CHANGELOG.md`. - **0.24.2** — built-in tool sandbox fixes (path escapes, `search` flag injection, Gemini key out of the URL, tool panics contained). - **0.24.1** — `retry_safe_events`. +- **yoagent-rutis 0.7.1** — pi adapter: `model` / `models` give + extensions `ctx.model` (default: the run's model id under provider + `yoagent`) and a read-only `ctx.modelRegistry`; `execFor` grants + `pi.exec` per extension file. pi observer events (`agent_end`, + `turn_end`, `tool_execution_*`, …) now fire. Opt-in DSH host + (`adapters::dsh_host_rows`) gives DSH plugins a stand-in DSH agent. - **yoagent-rutis 0.7.0** — pi adapter: **`pi.exec` is closed by default** (row config `exec`: `true`, or an exact command list; only the command is checked, so granting `git`/`sh`/`node` grants anything; a