Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
ad720fa
feat(team): support explicit manual teammates
Jul 6, 2026
4c90c9a
fix(team): return JSON for shutdown rejection
Jul 6, 2026
9eeae4f
fix(team): defer create session warmup
Jul 6, 2026
b984cf3
fix(team): isolate team runtime warmup
Jul 6, 2026
e6422a4
fix(acp): narrow stale session recovery
Jul 6, 2026
3f7b5c9
fix(team): expose team config options snapshot
Jul 6, 2026
9669a2b
fix(team): keep config options snapshot read-only
Jul 6, 2026
64d3011
fix(team): rebuild agents in bounded parallel
Jul 6, 2026
fcdbd7d
fix(team): rebuild agents serially
Jul 6, 2026
62905fb
fix(team): include agent identity in rebuild errors
Jul 6, 2026
1ff6207
Merge remote-tracking branch 'origin/main' into aionissue/task-202607…
Jul 6, 2026
949bc13
Stagger team agent warmup
Jul 7, 2026
27d3923
Tighten team assistant tool contracts
Jul 7, 2026
5e9ea13
Restrict prompt dumps to team diagnostics
Jul 7, 2026
a102dfe
Align team assistant tool contract
Jul 7, 2026
372caec
Project manual team membership notices
Jul 7, 2026
078eda5
fix(team): handle runtime readiness lifecycle
Jul 7, 2026
76231cb
Persist team session mode for dynamic agents
Jul 7, 2026
a5eb24a
Fix team mode seed after runtime rejection
Jul 7, 2026
ee31c6a
fix(team): serialize member edits during warmup
Jul 7, 2026
9db9804
fix(team): serialize member rename during warmup
Jul 7, 2026
14d3d6b
Merge remote-tracking branch 'origin/main' into aionissue/task-202607…
Jul 7, 2026
3beda6e
feat: add agent final input dump helper
Jul 8, 2026
c8fd44e
chore: label team prompt dump scope
Jul 8, 2026
87f698e
feat: dump acp final input
Jul 8, 2026
2c4a979
feat: dump aionrs final input
Jul 8, 2026
db24316
chore: finish agent final input dump verification
Jul 8, 2026
b963c7d
fix: fallback builtin assistant rules locale
Jul 8, 2026
4648dc2
Merge remote-tracking branch 'origin/main' into aionissue/task-202607…
Jul 8, 2026
1fe1cfc
feat(team): expose task list filters in prompts
Jul 8, 2026
3e05c28
feat(team): render bounded wake task summary
Jul 8, 2026
8f03c69
test(team): cover wake summary prompt integration
Jul 8, 2026
d4242f0
feat(team): filter team task list tool
Jul 8, 2026
a4fac97
feat(team): forward task list filters from stdio
Jul 8, 2026
bb62ce8
chore(team): verify bounded task board summary
Jul 8, 2026
ab339ea
feat(team): include leader identity in wake prompt
Jul 8, 2026
e302bec
chore(team): shorten wake task list hint
Jul 8, 2026
2c31fdc
fix(team): sort pending wake tasks by update time
Jul 8, 2026
5599af0
feat(team): focus teammate wake task summaries
Jul 8, 2026
390ff74
Merge remote-tracking branch 'origin/main' into aionissue/task-202607…
Jul 9, 2026
a4a73ac
Fix team MCP capability detection
Jul 9, 2026
9650c21
Unify team assistant selection gating
Jul 9, 2026
adb526f
Optimize team wake prompt summaries
Jul 9, 2026
320482c
fix(team): recover idle-cleaned team sessions
Jul 9, 2026
087bd82
Emit team-level session error on warmup failure
Jul 9, 2026
65efa73
Replace team MCP status warmup event
Jul 9, 2026
1d4c446
Emit ready for existing team sessions
Jul 9, 2026
77bb2e1
Avoid team session starting event on ready fast path
Jul 9, 2026
6858897
fix(team): relax MCP capability detection
Jul 9, 2026
b471ba4
feat(team): add member runtime lifecycle registry
Jul 10, 2026
0911afc
fix(team): preserve terminal attach outcomes
Jul 10, 2026
b876a74
refactor(team): enforce member runtime operation ownership
Jul 10, 2026
d18a2d5
fix(team): reconcile dynamic member runtimes in place
Jul 10, 2026
c7a16de
fix(team): fence dynamic runtime completion by session generation
Jul 10, 2026
2e7192f
refactor(team): reserve dynamic runtime before membership events
Jul 10, 2026
3aaa07c
fix(team): isolate dynamic member failure and removal
Jul 10, 2026
065648b
fix(acp): recover exact stale meta-resume session
Jul 10, 2026
0bd4891
refactor(team): centralize slot work coordination
Jul 10, 2026
5ffdfb0
Merge remote-tracking branch 'origin/main' into aionissue/task-202607…
Jul 10, 2026
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
1 change: 1 addition & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions crates/aionui-ai-agent/src/agent_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -529,9 +529,11 @@ mod aionrs_config_option_tests {
compat_overrides: Default::default(),
session_directory: std::env::temp_dir().join("aionrs-agent-task-test-sessions"),
session_mode: None,
skills: Vec::new(),
extra_mcp_servers: std::collections::HashMap::new(),
bedrock_config: None,
runtime_env: Vec::new(),
prompt_dump_dir: None,
}
}

Expand Down
97 changes: 94 additions & 3 deletions crates/aionui-ai-agent/src/dev_prompt_dump.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ use std::io;
use std::path::{Path, PathBuf};
use std::time::{SystemTime, UNIX_EPOCH};

use serde_json::Value;

pub(crate) struct PromptDump<'a> {
pub kind: &'static str,
pub backend: Option<&'a str>,
Expand All @@ -13,6 +15,17 @@ pub(crate) struct PromptDump<'a> {
pub prompt: &'a str,
}

pub(crate) struct AgentFinalInputDump<'a> {
pub kind: &'static str,
pub backend: &'static str,
pub conversation_id: &'a str,
pub session_id: Option<&'a str>,
pub msg_id: Option<&'a str>,
pub turn_id: Option<&'a str>,
pub input: Value,
pub resolved_context: Value,
}

pub(crate) fn dump_dir_for_data_dir(data_dir: &Path, enabled: bool) -> Option<PathBuf> {
if enabled {
Some(data_dir.join("prompt-dumps"))
Expand Down Expand Up @@ -51,6 +64,36 @@ pub(crate) fn dump_prompt(dump_dir: &Path, dump: PromptDump<'_>) -> io::Result<P
Ok(path)
}

pub(crate) fn dump_agent_final_input(dump_dir: &Path, dump: AgentFinalInputDump<'_>) -> io::Result<PathBuf> {
fs::create_dir_all(dump_dir)?;

let created_at_ms = current_time_ms();
let stamp = current_time_nanos();
let discriminator = dump.msg_id.or(dump.session_id).or(dump.turn_id).unwrap_or("none");
let file_name = format!(
"{}-{}-{}-{}.json",
stamp,
sanitize_segment(dump.kind),
sanitize_segment(dump.conversation_id),
sanitize_segment(discriminator)
);
let path = dump_dir.join(file_name);

let body = serde_json::to_vec_pretty(&serde_json::json!({
"kind": dump.kind,
"backend": dump.backend,
"conversation_id": dump.conversation_id,
"session_id": dump.session_id.unwrap_or("none"),
"msg_id": dump.msg_id.unwrap_or("none"),
"turn_id": dump.turn_id.unwrap_or("none"),
"created_at_ms": created_at_ms,
"input": dump.input,
"resolved_context": dump.resolved_context,
}))?;
fs::write(&path, body)?;
Ok(path)
}

fn current_time_ms() -> u128 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
Expand Down Expand Up @@ -91,7 +134,7 @@ mod tests {
let path = dump_prompt(
temp.path(),
PromptDump {
kind: "acp-first-prompt",
kind: "test-prompt",
backend: Some("claude"),
conversation_id: "conversation/123",
session_id: Some("session-1"),
Expand All @@ -104,12 +147,12 @@ mod tests {

assert_eq!(path.parent(), Some(temp.path()));
let file_name = path.file_name().unwrap().to_string_lossy();
assert!(file_name.contains("acp-first-prompt"));
assert!(file_name.contains("test-prompt"));
assert!(file_name.contains("conversation_123"));
assert!(file_name.contains("msg-1"));

let content = std::fs::read_to_string(path).unwrap();
assert!(content.contains("kind: acp-first-prompt\n"));
assert!(content.contains("kind: test-prompt\n"));
assert!(content.contains("backend: claude\n"));
assert!(content.contains("conversation_id: conversation/123\n"));
assert!(content.contains("session_id: session-1\n"));
Expand All @@ -118,6 +161,54 @@ mod tests {
assert!(content.ends_with("---- prompt ----\nfinal prompt body\n"));
}

#[test]
fn dump_agent_final_input_writes_json_with_raw_values() {
let temp = tempfile::tempdir().unwrap();

let path = dump_agent_final_input(
temp.path(),
AgentFinalInputDump {
kind: "acp-final-input",
backend: "acp",
conversation_id: "conversation/123",
session_id: Some("session-1"),
msg_id: Some("msg-1"),
turn_id: Some("turn-1"),
input: serde_json::json!({
"content": "[Assistant Rules]\nraw secret\n[/Assistant Rules]\n\nhello"
}),
resolved_context: serde_json::json!({
"mcp_servers": [{
"name": "raw-mcp",
"env": { "TOKEN": "raw-token-value" }
}]
}),
},
)
.unwrap();

let file_name = path.file_name().unwrap().to_string_lossy();
assert!(file_name.contains("acp-final-input"));
assert!(file_name.contains("conversation_123"));
assert!(file_name.contains("msg-1"));

let dump: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(path).unwrap()).unwrap();
assert_eq!(dump["kind"], "acp-final-input");
assert_eq!(dump["backend"], "acp");
assert_eq!(dump["conversation_id"], "conversation/123");
assert_eq!(dump["session_id"], "session-1");
assert_eq!(dump["msg_id"], "msg-1");
assert_eq!(dump["turn_id"], "turn-1");
assert_eq!(
dump["input"]["content"],
"[Assistant Rules]\nraw secret\n[/Assistant Rules]\n\nhello"
);
assert_eq!(
dump["resolved_context"]["mcp_servers"][0]["env"]["TOKEN"],
"raw-token-value"
);
}

#[test]
fn disabled_dump_prompts_returns_no_dump_dir() {
let data_dir = Path::new("/Users/alice/.aionui-dev");
Expand Down
3 changes: 3 additions & 0 deletions crates/aionui-ai-agent/src/factory/aionrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ pub(super) async fn build(
ctx: FactoryContext,
) -> Result<AgentInstance, AgentError> {
let mut overrides = build_context.config;
let resolved_skills = overrides.skills.clone();

// Merge preset assistant rules into system_prompt (used as custom_prompt
// in aionrs's build_system_prompt). Mirrors the old architecture's
Expand Down Expand Up @@ -166,9 +167,11 @@ pub(super) async fn build(
compat_overrides,
session_directory,
session_mode: overrides.session_mode,
skills: resolved_skills,
extra_mcp_servers,
bedrock_config,
runtime_env: ctx.runtime_env,
prompt_dump_dir: crate::dev_prompt_dump::dump_dir_for_data_dir(&deps.data_dir, deps.dump_prompts),
};

if let Some(system_prompt) = config.system_prompt.as_deref()
Expand Down
Loading
Loading