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
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{".":"0.2.1"}
{".":"0.2.2"}
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
# Changelog

## [0.2.2](https://github.com/suoak/AionCore/compare/v0.2.1...v0.2.2) (2026-08-29)

### Features

* **conversation:** mid-turn interjection — deliver messages into a running claude/codex turn
* **session:** distinguish Task subagents from background tasks (`AgentContainer`)
* **skills:** slim auto-inject skill descriptions to the 200-char injection budget

### Bug Fixes

* **ai-agent:** wait for terminal output before asserting after process exit

### Chores

* **cli:** verify claude against 2.1.236
* **acp:** bump codebuddy 2.141.0 and dimcode 0.3.22 registry pins

## [0.2.1](https://github.com/suoak/AionCore/compare/v0.2.0...v0.2.1) (2026-08-29)

### Bug Fixes
Expand Down
54 changes: 27 additions & 27 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ members = [
]

[workspace.package]
version = "0.2.1"
version = "0.2.2"
edition = "2024"
license = "MIT"

Expand Down
37 changes: 37 additions & 0 deletions crates/aionui-ai-agent/src/agent_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,16 @@ pub trait IAgentTask: Send + Sync {
PromptMediaCaps::default()
}

/// Whether a message sent right now reaches the agent without waiting for
/// the current turn to end (task-1 brief: mid-turn interjection). Mirrors
/// `aionui_session::Capabilities::supports_midturn_delivery` — defaults
/// false (ACP-like) so only backends that genuinely deliver mid-turn
/// (the clean-slate `Session` variant reading claude/codex capabilities)
/// opt in.
fn supports_midturn_delivery(&self) -> bool {
false
}

/// Send a user message to the agent. Returns once the agent has
/// accepted the turn; actual streaming proceeds on the broadcast
/// channel returned by [`Self::subscribe`].
Expand Down Expand Up @@ -132,6 +142,11 @@ pub trait IMockAgent: IAgentTask {
fn get_session_key(&self) -> Option<String> {
None
}
/// B5 mid-turn delivery test seam. Default: forward to `send_message` so
/// simple mocks behave; mid-turn tests override to record the routed call.
async fn deliver_midturn(&self, data: SendMessageData) -> Result<(), AgentSendError> {
self.send_message(data).await
}
async fn mode(&self) -> Result<aionui_api_types::AgentModeResponse, AgentError> {
Ok(aionui_api_types::AgentModeResponse {
mode: "default".into(),
Expand Down Expand Up @@ -273,6 +288,12 @@ impl AgentInstance {
self.as_task().subscribe()
}

/// Whether a message sent right now reaches the agent without waiting
/// for the current turn to end. See `IAgentTask::supports_midturn_delivery`.
pub fn supports_midturn_delivery(&self) -> bool {
self.as_task().supports_midturn_delivery()
}

/// Send a user message to the agent.
pub async fn send_message(&self, data: SendMessageData) -> Result<(), AgentSendError> {
self.as_task().send_message(data).await
Expand Down Expand Up @@ -308,6 +329,22 @@ impl AgentInstance {
}
}

/// B5 mid-turn delivery: hand a message to the RUNNING turn instead of
/// opening a new one. Only meaningful when
/// [`Self::supports_midturn_delivery`] is true — the conversation layer
/// gates on that bit before routing here. Variants without the path reject
/// (the caller must not have routed them here).
pub async fn deliver_midturn(&self, data: SendMessageData) -> Result<(), AgentSendError> {
match self {
Self::Acp(_) | Self::Aionrs(_) => Err(AgentSendError::from_agent_error(AgentError::BadRequest(
"mid-turn delivery is not supported by this agent".into(),
))),
Self::Session(m) => m.deliver_midturn(data).await,
#[cfg(any(test, feature = "test-support"))]
Self::Mock(m) => m.deliver_midturn(data).await,
}
}

/// Cancel the current streaming response without killing the agent.
pub async fn cancel(&self) -> Result<(), AgentError> {
self.as_task().cancel().await
Expand Down
2 changes: 2 additions & 0 deletions crates/aionui-ai-agent/src/capability/backend_output_sink.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ impl OutputSink for BackendOutputSink {
input: Some(parsed_input),
output: None,
description: None,
parent_call_id: None,
}));
}

Expand Down Expand Up @@ -115,6 +116,7 @@ impl OutputSink for BackendOutputSink {
Some(content.to_owned())
},
description: None,
parent_call_id: None,
}));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ impl ProtocolEmitter for BackendProtocolSink {
input: None,
output: None,
description: Some(Self::execution_description(execution_id, "execute")),
parent_call_id: None,
}));
}

Expand Down Expand Up @@ -189,6 +190,7 @@ impl ProtocolEmitter for BackendProtocolSink {
error_code,
truncation,
)),
parent_call_id: None,
}));
}

Expand Down Expand Up @@ -219,6 +221,7 @@ impl ProtocolEmitter for BackendProtocolSink {
})
.to_string(),
),
parent_call_id: None,
}));
}

Expand Down
2 changes: 1 addition & 1 deletion crates/aionui-ai-agent/src/claude_flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ mod tests {
assert!(!supported("2.1.0"), "2.1.0 hard-errors on --thinking-display");
assert!(!supported("2.1.190"), "below the verified floor stays off");
assert!(supported("2.1.191"), "lowest live-probed OK version");
assert!(supported("2.1.235"), "the release this integration is verified against");
assert!(supported("2.1.236"), "the release this integration is verified against");
assert!(supported("2.1.220"));
assert!(supported("3.0.0"), "a future major must not regress the gate");
}
Expand Down
Loading
Loading