Commands
create, send, stream
--from-seq replays every event after a sequence number, so a reconnecting client never misses or duplicates events. Omit it to tail live from now. See Events & streaming.
A structured answer for one session
--output-schema takes a path to a JSON Schema file and overrides the agent’s schema for this run;
--require-output refuses a clean ending that produced nothing matching it.
structured_output, on the session.idle event and on the
session.idle webhook. See Structured outputs.
Money.
--budget-usd takes a decimal-dollar string and is converted client-side to integer micro-USD (the wire field is cap_micro_usd; 1 USD = 1_000_000 micro-USD). JSON amounts are integer *_micro_usd.interrupt, steer & queue
A running session ignores a plainsend (it returns session_running). Steer it in one call with --interrupt, interrupt on its own, or hold the words for the next turn with --queue:
--queue is queue: true on the wire: the message waits in the session’s inbox and becomes the input of the turn that follows the one running; on an idle session it is a plain send. --interrupt and --queue together are refused (validation_failed).
The inbox: what is waiting on you
A session that has stopped and is waiting on a person isidle, exactly like one that finished its
work — status cannot tell them apart. stop_reason can, so it is a filter:
vetta session inbox asks that question for every reason a person can clear —
awaiting_answer, awaiting_approval and budget_paused — and prints the id, the tool_call to
quote back, and one line saying what each session wants:
awaiting_delegation is deliberately absent: a coordinator waiting on its own threads is blocked on
work, not on you. inbox is a view over list and does not page — narrow it with --stop-reason
and --limit, or use vetta session list when there are more parked sessions than fit.
confirm & tool-result
When the agent pauses on a guarded tool, the session goesidle with stop_reason: awaiting_approval and a tool.confirm event. Resolve it:
identities_create is a
second card. --for-session answers it once and grants that tool for the rest of the chat:
--allow — there is no session-wide deny. For a call through the
tool invoker (tools_execute) the tool granted is the one in its tool argument, not the invoker.
answer a parked question
An agent that needs something from you parks the turn: the session goesidle with
stop_reason: awaiting_answer and carries the question in pending_actions. confirm cannot
resolve it — that route says only allow or deny, and “allow” is not an answer to “which mailbox?”.
At a terminal, vetta session answer prints the question and asks for each field in turn:
--tool-call is only needed when a session holds more than one parked question.
run exit codes
vetta session run (and the top-level vetta run) block until the session goes idle/terminal, then set the process exit code from the terminal stop_reason so scripts and CI can branch. Idle is not inherently success — the exit code reflects stop_reason:
A session that never reported why it stopped exits
1, and a bad command line exits 2.
usage
Changing tools mid-session
budget
There is no
--remove: a session always carries a cap. Raise it, or let the session stop at budget_paused.
cancel
--session and no other flag.
Files a session produced in its sandbox are not durable unless the agent promoted them with
publish_file. List what a run published with vetta file list --session $SID — there is no vetta session files.