Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion integrations/yoagent-rutis/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
13 changes: 12 additions & 1 deletion skills/yoagent/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Loading