From 66255839b9c87a0d7d50dd854fac7cb025c3db94 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 7 Oct 2026 22:46:48 +0000 Subject: [PATCH] Release solid_agent 0.2.1 Cuts the changelog: the paused-generation handling from #10 (and the tool-call dedupe and resuming_generation? that came with it) is 0.2.1, and the rest of what sat under Unreleased shipped as 0.2.0 on 2026-08-18. The version and the lockfile's own entry move to 0.2.1. A patch release for activeagent 1.9, whose generations can pause to ask the user and resume with the answer. Both suites pass: 251 unit and 195 record tests. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0124DWuS48dmwj6duguc2wmh --- CHANGELOG.md | 51 +++++++++++++++++++++++--------------- Gemfile.lock | 2 +- lib/solid_agent/version.rb | 2 +- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58d824c..a130caa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [0.2.1] - 2026-10-07 + +A patch release for activeagent 1.9, whose generations can pause to ask the +user and resume with the answer. + +### Added + +- **`HasContext#resuming_generation?`** answers whether a generation resumes + one that paused for user input: true when the agent defines a public + `resuming?` that returns true, or after `self.resuming_generation = true`. + The writer is for a host that replays a stored conversation itself. Both + are private, so neither becomes one of the agent's actions. + +### Fixed + +- **`HasContext` skips persisting the response of a generation paused for + user input, and the prompt of the generation that resumes it.** A response + answering `awaiting_input?` with true is returned untouched: no generation + record, no assistant row and no tool rows, because its last message is an + unfinished turn. The paused generation's prompt, the user turn, is still + persisted. The resumed generation skips prompt persistence, because its + prompt replays that turn, and persists its response as usual. Both checks + are duck-typed, so framework releases without a pause behave as before. + +- Tool messages are now deduped by `tool_call_id` within one response's + stack as well as against rows already on the context, so a stack that + repeats a call persists it once even when the context's `messages` scope + cannot see rows written earlier in the same pass. + +## [0.2.0] - 2026-08-18 + ### Added - **`SolidAgent::Records::*` — behavior for the agent-configuration records.** @@ -40,28 +71,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **`CHANGELOG.md`**, which the gemspec already advertised. -- **`HasContext#resuming_generation?`** answers whether a generation resumes - one that paused for user input: true when the agent defines a public - `resuming?` that returns true, or after `self.resuming_generation = true`. - The writer is for a host that replays a stored conversation itself. Both - are private, so neither becomes one of the agent's actions. - ### Fixed -- **`HasContext` skips persisting the response of a generation paused for - user input, and the prompt of the generation that resumes it.** A response - answering `awaiting_input?` with true is returned untouched: no generation - record, no assistant row and no tool rows, because its last message is an - unfinished turn. The paused generation's prompt, the user turn, is still - persisted. The resumed generation skips prompt persistence, because its - prompt replays that turn, and persists its response as usual. Both checks - are duck-typed, so framework releases without a pause behave as before. - -- Tool messages are now deduped by `tool_call_id` within one response's - stack as well as against rows already on the context, so a stack that - repeats a call persists it once even when the context's `messages` scope - cannot see rows written earlier in the same pass. - - `SolidAgent.context_class`, `message_class` and `generation_class` had no consumers while the shipped initializer template told hosts to set them, so uncommenting it did nothing. `HasContext#infer_class_names` now reads them. diff --git a/Gemfile.lock b/Gemfile.lock index 670adb6..c3a52d3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - solid_agent (0.2.0) + solid_agent (0.2.1) activeagent (>= 1.0.0) activemodel (>= 7.0) activerecord (>= 7.0) diff --git a/lib/solid_agent/version.rb b/lib/solid_agent/version.rb index 5c18928..7af6a4d 100644 --- a/lib/solid_agent/version.rb +++ b/lib/solid_agent/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module SolidAgent - VERSION = "0.2.0" + VERSION = "0.2.1" end