Skip to main content
Supplying a prompt or action flag to truffile convo uses one-shot mode: the command performs the request, writes its result, and exits. A prompt without a target creates a new side thread on first send. Use --main only when the user explicitly wants Main.

Prompt sources and targets

Positional text, --prompt-file, and --stdin may be combined; Truffile joins their non-empty contents with blank lines. With piped stdin and no positional or file prompt, stdin is read automatically. The target flags are mutually exclusive. Omitting all of them selects a new side-thread draft. --thread title matching is case-insensitive and must be unambiguous.

Actions and output controls

Without --json, final response content goes to stdout. Diagnostics, durable thinking requested by --show-thinking, and text-mode errors go to stderr. Use --json --quiet when another program will parse stdout. --timeout is opt-in. When it expires, Truffile requests an interrupt, emits the durable result it has, marks it timed out, and exits 124.

JSON contracts

Turn result

thinking and tool_calls are arrays when present. status can be ok, error, interaction_required, interrupted, timeout, or fence_lost. Setup, OAuth, and action nodes that need a supported client set pending_user_response and return interaction_required.

Thread list

The one-release tasks alias contains the same rows as threads.

History

Local hide and restore

Rename returns thread_id, title, and backend. Interrupt returns thread_id and interrupted: true. App listing returns an apps array whose rows contain name, bundle_id, and uuid. JSON failures contain backend, device, status, and error when those values are available.

Exit codes

If exit code 75 is returned, do not retry or resend automatically. Durable output was retained, but the lost completion fence means the caller cannot prove that the original turn finished.

Compatibility aliases and Task cutoff

--task-id, --list-tasks, /tasks, and the task_id JSON key are one-release compatibility aliases. Their values are decimal Convo thread IDs; they do not expose the retired Task backend. /resume and /switch are also temporary interactive spellings for the Convo thread picker. A legacy Task UUID fails with this migration error:
Convo has no per-thread app allowlist. --app and dynamic /<app> requests fail, interactive /apps does not exist, and no app is attached or restricted. Use truffile convo --list-apps or truffile list apps for discovery only.

Safe follow-ups

Only chain a follow-up after the opening command exits successfully: