Session Tools
Session tools enable persistent, asynchronous coordination between agent sessions.
Available Tools
sessions_list
List sessions visible to the current policy.
Input:
{
"filter": "optional text",
"limit": 20
}
sessions_history
Read message history from a target session.
Input:
{
"key": "agent:research:main",
"limit": 20,
"offset": 0
}
sessions_search
Search prior session history for relevant snippets. By default the current
session is excluded when _session_key is available in tool context.
{
"query": "checkpoint rollback",
"limit": 5,
"exclude_current": true
}
sessions_send
Send a message to another session, optionally waiting for reply.
{
"key": "agent:coder:main",
"message": "Please implement JWT middleware",
"wait_for_reply": true,
"context": "coordinator"
}
Session Access Policy
Configure policy in a preset to control what sessions a sub-agent can access:
[agents.presets.coordinator]
tools.allow = ["sessions_list", "sessions_history", "sessions_search", "sessions_send", "task_list", "spawn_agent"]
sessions.can_send = true
[agents.presets.observer]
tools.allow = ["sessions_list", "sessions_history", "sessions_search"]
sessions.key_prefix = "agent:research:"
sessions.can_send = false
Policy fields:
key_prefix: restrict visibility by session-key prefixallowed_keys: extra explicit session keyscan_send: controlssessions_send(default:true)cross_agent: allow access to sessions owned by other agents (default:false)
When no policy is configured, all sessions are visible and sendable.
Coordination Patterns
Use spawn_agent when work is short-lived and synchronous. For longer delegated
work, call spawn_agent with nonblocking: true; it returns a task_id while
the sub-agent continues in the background. Use spawn_status to check progress,
spawn_result to fetch the final output, spawn_list to recover task IDs after
context loss, and cancel_spawn to stop work that is no longer needed.
Use active_tools and tool_choice to prevent model drift on small/cheap
LLMs. These controls apply per agent run (not per iteration within a run)
and are available on agent presets, spawn_agent, and cron agentTurn
payloads.
active_toolsfilters the tool schemas visible to the agent.tool_choicecontrols provider-level tool selection:auto— model decides (default).any— model must call some tool but chooses which one.none— no tools sent; forces text-only output.tool+name— model must call the named tool.
Supported on Anthropic, OpenAI (Responses and Chat Completions), and OpenAI-compatible providers.
Classify-then-generate pattern — use two spawn_agent calls, each with
its own tool controls:
// Turn 1: forced classifier
{
"task": "Classify whether the reply should be inline, file, or PR.",
"active_tools": ["classify_destination"],
"tool_choice": { "type": "tool", "name": "classify_destination" },
"nonblocking": true
}
// Turn 2: scoped generation (parent reads classifier result, spawns again)
{
"task": "Generate the report and send it as a document.",
"active_tools": ["write_file", "send_document"],
"tool_choice": { "type": "auto" }
}
Example preset defaults:
[agents.presets.destination-router.tool_controls]
active_tools = ["classify_destination"]
[agents.presets.destination-router.tool_controls.tool_choice]
type = "tool"
name = "classify_destination"
Example scheduled agent turn:
{
"kind": "agentTurn",
"message": "Generate the report and send it as a document.",
"active_tools": ["write_file", "send_document"],
"tool_choice": { "type": "any" }
}
Use session tools when you need:
- long-lived specialist sessions
- handoffs with durable history
- asynchronous team-style orchestration
Common coordinator flow:
sessions_listto discover workerssessions_searchto find prior related worksessions_historyto inspect progresssessions_sendto dispatch next taskstask_listto track cross-session work items