feat(agents): allow passing agent variables to agent__spawn and agent__task_create
- agent__spawn accepts an optional variables object (string->string); values overlay the parent-inherited agent variables per key, with inheritance preserved as the fallback layer - unknown variable names, non-string values, and non-object shapes return self-correcting status:error JSON listing the agent's declared variables - spawned children can no longer trigger the interactive variable prompt: a new interactive gate in Agent::init_agent_variables routes missing required variables to the existing bail path while leaving CLI/REPL prompting and --info skip semantics unchanged - agent__task_create persists variables on the task, agent__task_list echoes them, and task auto-dispatch threads them into the spawn - tool schemas and built-in spawn docs updated; unit tests extended in agents.rs and taskqueue.rs
This commit is contained in:
6 files changed
+339
-35
No files matched your search
+2
-1
@@ -329,6 +329,7 @@ impl Agent {
|
||||
agent_variables: &[AgentVariable],
|
||||
pre_set_variables: Option<&AgentVariables>,
|
||||
no_interaction: bool,
|
||||
interactive: bool,
|
||||
) -> Result<AgentVariables> {
|
||||
let mut output = IndexMap::new();
|
||||
if agent_variables.is_empty() {
|
||||
@@ -349,7 +350,7 @@ impl Agent {
|
||||
if no_interaction {
|
||||
continue;
|
||||
}
|
||||
if *IS_STDOUT_TERMINAL {
|
||||
if interactive && *IS_STDOUT_TERMINAL {
|
||||
if !printed {
|
||||
println!("⚙ Init agent variables...");
|
||||
printed = true;
|
||||
|
||||
@@ -84,13 +84,13 @@ pub(in crate::config) const DEFAULT_SPAWN_INSTRUCTIONS: &str = indoc! {"
|
||||
|
||||
| Tool | Purpose |
|
||||
|------|----------|
|
||||
| `agent__spawn` | Spawn a subagent in the background. Returns an `id` immediately. |
|
||||
| `agent__spawn` | Spawn a subagent in the background. Returns an `id` immediately. Optional `variables` (string map) sets the target agent's declared variables, overriding inherited values. |
|
||||
| `agent__check` | Non-blocking status probe: running or finished. Never returns/consumes the result — use `agent__collect`. |
|
||||
| `agent__collect` | Blocking wait: wait for an agent to finish, return its output. |
|
||||
| `agent__list_available` | List all agent types you can spawn (name + description). Use this to discover specialists before calling `agent__spawn`. |
|
||||
| `agent__list_running` | List all subagents YOU have spawned, with their status. |
|
||||
| `agent__cancel` | Cancel a running agent by ID. |
|
||||
| `agent__task_create` | Create a task in the dependency-aware task queue. |
|
||||
| `agent__task_create` | Create a task in the dependency-aware task queue. Optional `variables` (string map) is passed to the auto-dispatched agent. |
|
||||
| `agent__task_list` | List all tasks and their status/dependencies. |
|
||||
| `agent__task_complete` | Mark a task done; returns any newly unblocked tasks. Auto-dispatches agents for tasks with a designated agent. |
|
||||
| `agent__task_fail` | Mark a task as failed. Dependents remain blocked. |
|
||||
|
||||
@@ -1191,6 +1191,7 @@ impl RequestContext {
|
||||
agent.defined_variables(),
|
||||
self.agent_variables.as_ref(),
|
||||
self.info_flag,
|
||||
self.self_agent_id.is_none(),
|
||||
)?;
|
||||
agent.set_shared_variables(new_variables);
|
||||
}
|
||||
@@ -1213,6 +1214,7 @@ impl RequestContext {
|
||||
agent.defined_variables(),
|
||||
self.agent_variables.as_ref(),
|
||||
self.info_flag,
|
||||
self.self_agent_id.is_none(),
|
||||
)?;
|
||||
agent.set_shared_variables(new_variables.clone());
|
||||
new_variables
|
||||
|
||||
Reference in new issue
Block a user