4.2 KiB
4.2 KiB
summary, read_when
| summary | read_when | |
|---|---|---|
| Agent session tools for listing sessions, fetching history, and sending cross-session messages |
|
Session Tools
Goal: small, hard-to-misuse tool surface so agents can list sessions, fetch history, and send to another session.
Tool Names
sessions_listsessions_historysessions_send
Key Model
- Main direct chat bucket is always the literal key
"main". - Group chats use
surface:group:<id>orsurface:channel:<id>. - Cron jobs use
cron:<job.id>. - Hooks use
hook:<uuid>unless explicitly set. - Node bridge uses
node-<nodeId>unless explicitly set.
global and unknown are internal-only and never listed. If session.scope = "global", we alias it to main for all tools so callers never see global.
sessions_list
List sessions as an array of rows.
Parameters:
kinds?: string[]filter: any of"main" | "group" | "cron" | "hook" | "node" | "other"limit?: numbermax rows (default: server default, clamp e.g. 200)activeMinutes?: numberonly sessions updated within N minutesmessageLimit?: number0 = no messages (default 0); >0 = include last N messages
Behavior:
messageLimit > 0fetcheschat.historyper session and includes the last N messages.- Tool results are filtered out in list output; use
sessions_historyfor tool messages.
Row shape (JSON):
key: session key (string)kind:main | group | cron | hook | node | otherprovider:whatsapp | telegram | discord | signal | imessage | webchat | internal | unknowndisplayName(group display label if available)updatedAt(ms)sessionIdmodel,contextTokens,totalTokensthinkingLevel,verboseLevel,systemSent,abortedLastRunsendPolicy(session override if set)lastChannel,lastTotranscriptPath(best-effort path derived from store dir + sessionId)messages?(only whenmessageLimit > 0)
sessions_history
Fetch transcript for one session.
Parameters:
sessionKey(required)limit?: numbermax messages (server clamps)includeTools?: boolean(default false)
Behavior:
includeTools=falsefiltersrole: "toolResult"messages.- Returns messages array in the raw transcript format.
sessions_send
Send a message into another session.
Parameters:
sessionKey(required)message(required)timeoutSeconds?: number(default >0; 0 = fire-and-forget)
Behavior:
timeoutSeconds = 0: enqueue and return{ runId, status: "accepted" }.timeoutSeconds > 0: wait up to N seconds for completion, then return{ runId, status: "ok", reply }.- If wait times out:
{ runId, status: "timeout", error }. Run continues; callsessions_historylater. - If the run fails:
{ runId, status: "error", error }. - Waits via gateway
agent.wait(server-side) so reconnects don't drop the wait. - Agent-to-agent message context is injected for the primary run.
- After the primary run completes, Clawdbot runs a reply-back loop:
- Round 2+ alternates between requester and target agents.
- Reply exactly
REPLY_SKIPto stop the ping‑pong. - Max turns is
session.agentToAgent.maxPingPongTurns(0–5, default 5).
- Once the loop ends, Clawdbot runs the agent‑to‑agent announce step (target agent only):
- Reply exactly
ANNOUNCE_SKIPto stay silent. - Any other reply is sent to the target channel.
- Announce step includes the original request + round‑1 reply + latest ping‑pong reply.
- Reply exactly
Provider Field
- For groups,
provideris thesurfacerecorded on the session entry. - For direct chats,
providermaps fromlastChannel. - For cron/hook/node,
providerisinternal. - If missing,
providerisunknown.
Security / Send Policy
Policy-based blocking by surface/chat type (not per session id).
{
"session": {
"sendPolicy": {
"rules": [
{
"match": { "surface": "discord", "chatType": "group" },
"action": "deny"
}
],
"default": "allow"
}
}
}
Runtime override (per session entry):
sendPolicy: "allow" | "deny"(unset = inherit config)- Settable via
sessions.patchor owner-only/send on|off|inherit.
Enforcement points:
chat.send/agent(gateway)- auto-reply delivery logic