Wait, Input, and Resume
Pause flows for human or agent input, then resume from where they left off.
kitaru.wait() suspends a running flow until someone — a human, another agent, or an external system — provides input. In non-interactive runs, the runner polls for input up to its timeout (default 600 seconds) and then releases compute; the execution can resume seconds, hours, or months later when input lands.
The wait/resume timeline

The server holds the run's durable state while compute is idle. When input lands, the runner picks up at the exact point the wait left off — same checkpoint state and same artifacts.
Full example
The flow calls .load() only for the human-facing wait question. The original summary checkpoint output is still passed to write_report(summary) so Kitaru keeps the durable data flow between checkpoints intact. See In flow bodies for more on when to materialize checkpoint outputs in orchestration code.
Where wait() can be called
kitaru.wait() must be called at flow scope. In practice, that means inside the @flow function body, before or after checkpoint calls, not inside a @checkpoint function.
A wait pauses the whole run. If wait() pauses from inside a checkpoint, the run can stop before that checkpoint call has completed cleanly. That can leave things in a confusing state where the run is waiting for input, but the checkpoint call is marked failed. To avoid that state, Kitaru raises this error immediately:
The companion rule is that wait() needs a running flow. If you call it outside a @flow, Kitaru raises wait() can only run inside a @flow.
If you need input halfway through a larger operation, split the operation into two checkpoints and put the wait between them:
The draft.load() call is only there so the reviewer can see the draft text in the wait question. The original draft checkpoint output still flows into the next checkpoint.
When execution reaches kitaru.wait():
The flow suspends and the execution moves to
waitingstatusThe question, schema, and metadata are recorded on the server
The runner polls for input up to its
timeout. If input arrives first, the flow continues in the same process. If the timeout elapses first, the runner exits and compute is released; input can still land later, andkitaru executions resumepicks up from exactly this point.
Providing input
From the CLI
From Python
From the UI
The UI shows all executions in waiting status with the question and expected schema. You can provide input directly from the UI.
Before timeout vs. after timeout
This is an important distinction. The timeout parameter (default: 600 seconds) controls how long the runner process keeps polling for input before it exits:
Input arrives before timeout
The runner is still alive and polling. When you provide input, the flow continues immediately in the same process. No extra step needed.
Input arrives after timeout
The runner has already exited and released compute. Your input is recorded on the server, but there is no running process to pick it up. You need to explicitly resume the execution:
The timeout is not a deadline on the wait itself — the wait never expires. It only controls how long the runner process stays alive polling for a response. After timeout, the input can still be provided at any time.
Wait parameters
name
Auto-generated
Identifier for this wait point (used when providing input)
question
None
Human-readable prompt shown in the CLI, UI, and MCP
schema
None
Expected type of the input. When None, the wait acts as a continue/abort gate returning None. Pass a type (e.g. bool, a Pydantic model) to validate input against it.
timeout
600
Seconds the runner polls before exiting (not a wait expiration)
metadata
None
Additional key-value data attached to the wait record
Next steps
Wait, Input, and Resume guide — detailed patterns including local interactive mode and abort
Execution Management — inspect, replay, and manage executions
Last updated
Was this helpful?