@duvoai/cli
Command-line interface for the Duvo public API.
Install
npm install -g @duvoai/cli
Requires Node.js ≥ 22.22.0.
Or install the standalone binary (no Node.js required):
curl -fsSL https://duvo.ai/install-cli.sh | sh
Update
duvo update
duvo update detects how the CLI was installed and updates in place:
npm installs run npm install -g @duvoai/cli@latest; the standalone
binary downloads the latest release, verifies its checksum, and
replaces itself. Use duvo update --check to see whether a newer
version exists without installing it.
Deprecation notices
When the API marks an endpoint as deprecated, this CLI prints a short warning to stderr (with the sunset date and a link if the server provides them). Deprecation warnings always show — they don't affect stdout and can't be silenced.
Quick start
# 1. Log in (prompts for your API key and saves it to a profile)
duvo login --name default
# 2. Verify you're logged in
duvo whoami
# 3. Create your first agent (interactive)
duvo agents create
# ...or create one non-interactively with flags
duvo agents create --name "My agent" --input "What this agent should do"
# ...optionally pick the LLM the agent runs on
duvo agents create --name "My agent" --model claude-opus-4-7
# 4. Kick off a run and watch it complete
duvo runs start --agent <agent-id> --follow
# Switch an existing agent to a different model later
duvo agents set-model <agent-id> --model claude-opus-4-7
Grab an API key from your team settings: https://app.duvo.ai/settings/api-keys.
Authentication
You can keep multiple profiles and switch between them:
duvo login --name acme # prompts for the API key
duvo login --name team-2 # prompts for the API key
duvo profiles list # show saved profiles
duvo profiles use acme # set the default profile
duvo --profile team-2 whoami # one-off override for a single command
Workflows
Start a run and stream messages
# Start a run and tail messages until it completes
duvo runs start --agent <agent-id> --message "Process this week's reports" --follow
# Tail messages on a run that's already in progress
duvo runs messages <run-id> --follow
--follow polls for new messages every 2 s and exits when the run reaches a
terminal state (completed, failed, stopped, or error). The final line
always shows the run's status, e.g. Run completed.
To consume the stream programmatically, combine --follow --json: each new
message is printed as a JSON object on its own line (NDJSON).
duvo runs messages <run-id> --follow --json | while IFS= read -r line; do
echo "$line" | jq -r '.text_content // empty'
done
Scripting with --json
Every command accepts --json to emit the raw API response instead of a
table or key/value view — useful for piping to jq.
# Start a run and capture the ID
RUN_ID=$(duvo runs start --agent "$AGENT_ID" --message "Go" --json | jq -r '.run.id')
# Follow messages on that run
duvo runs messages "$RUN_ID" --follow
Set up connections for an agent revision
Integrations represent slots in a revision that need live credentials (a
connection). Use revision-integrations to see the slots and
revision-integrations connections to pin your connections to them.
# 1. See the integration slots on a revision
duvo revision-integrations list --agent <agent-id> --revision <revision-id>
# INTEGRATION ID TYPE NAME SLOT ID CREATED
# 22222222-... gmail Gmail slot-1 2026-04-15…
# 2. List your available connections
duvo connections list --type gmail
# 3. Pin a connection to the slot (use SLOT ID or INTEGRATION ID from step 1)
duvo revision-integrations connections pin <connection-id> \
--agent <agent-id> --revision <revision-id> --integration slot-1
# 4. Verify
duvo revision-integrations connections list \
--agent <agent-id> --revision <revision-id> --integration slot-1
Note: The
--integrationflag accepts either the SLOT ID or the INTEGRATION ID column fromrevision-integrations list.
Work with queues
# Create a queue
duvo queues create --name "support-tickets"
# On a team that has moved to the Automations workspace, a queue has to be
# created inside an automation — `duvo automations list` gives you the id
duvo queues create --name "support-tickets" --automation-id <automation-id>
# `duvo agents create` takes the same flag; without it a new agent gets an
# automation of its own rather than joining an existing one
duvo agents create --name "Ticket triage" --automation-id <automation-id>
# Create cases in bulk from a JSON file (up to 100)
duvo cases create --queue <queue-id> --from-file cases.json
# List pending cases
duvo cases list --queue <queue-id> --status pending
# Count pending cases without fetching Case rows
duvo cases list --queue <queue-id> --status pending --count-only
# Get case status counts for several queues in one call
duvo queues stats --queue-ids <id1>,<id2>,<id3>
# Bulk re-process pending cases on an agent
duvo cases bulk-reprocess --queue <queue-id> --agent <agent-id> \
--ids <id1>,<id2>,<id3>
Human-in-the-loop responses
When a run pauses and asks a question, respond directly from the CLI:
duvo runs get <run-id> # shows pending_human_request details
duvo runs respond <run-id> # defaults to the current pending request
Commands
Clarity commands auto-detect process version where possible. The legacy v1 format uses a single analysis payload, while v2 is snapshot-based with current-process and transformation-proposal versions. Use v2-specific commands such as versions, current, proposal, compare, gaps, evidence, and readiness only for v2 processes.
Default output is summary-first and compact. JSON output also includes a compact summary block, while capture transcripts and media URLs are omitted unless --include-transcripts is passed.
duvo agents schedules list --all-users returns at most one response's worth of rows. On an agent with more schedules than that, the CLI warns that some are missing, and the rows it does return are the oldest by creation date.
| Command | Description |
|---|---|
duvo login | Store an API key under a named profile |
duvo logout | Remove a profile |
duvo whoami | Show the active profile, authenticated user, team ID, and auth type |
duvo profiles <subcmd> | list, use, rename, remove |
duvo update | Update the CLI to the latest version (--check to check without installing) |
duvo agents list | List agents on your team |
duvo agents get <id> | Show details for one agent |
duvo agents create | Create a new agent (--model to pick the LLM) |
duvo agents update <id> | Update an agent's name or settings |
duvo agents move <id> --to-team <id> | Move an agent (and its connected workspace) to another team (--all-together, --dry-run, -y, --json) |
duvo agents duplicate <id> (alias clone) | Duplicate an Agent into a "Copy of …" Agent; Memory is not copied (--no-connections, --no-queue, --no-skills-files, --no-logins-secrets, --no-plugins, --no-aop, --json) |
duvo agents models | List the LLM models available for agents |
duvo agents set-model <id> --model <model> | Switch the LLM model used by an agent's latest revision |
duvo agents eval-scores <agent-id> | Show aggregate evaluation scores for an agent's jobs (--since, --scope) |
duvo agents eval-rubrics <agent-id> | List an agent's active evaluation rubrics (--build) |
duvo agents schedules list <agent-id> | List schedules you own for an agent (duvo agents schedules <agent-id> also works; --all-users lists every member's, with who created each one, for elevated team roles) |
duvo agents schedules create <agent-id> --frequency <f> --timezone <tz> | Create a schedule for an agent (--time, --day, --day-of-month, --cron) |
duvo agents schedules update <agent-id> <schedule-id> | Update a schedule (--enable/--disable, --frequency, --time, --clear-*, ...) |
duvo agents schedules delete <agent-id> <schedule-id> | Delete a schedule |
duvo agents case-triggers list <agent-id> | List case triggers configured for an agent |
duvo agents case-triggers create <agent-id> --queue <id> | Create a case trigger for an agent |
duvo agents case-triggers get <agent-id> <trigger-id> | Get a case trigger by ID |
duvo agents case-triggers update <agent-id> <trigger-id> | Update a case trigger (--enable / --disable, --queue, --concurrency) |
duvo agents case-triggers delete <agent-id> <trigger-id> | Delete a case trigger |
duvo agents triggers list <agent-id> | List the event triggers you own on an agent |
duvo agents triggers types <agent-id> | List the event trigger types available for an agent |
duvo agents triggers set <agent-id> --integration <slug> --trigger-type <type> | Create or update an event trigger (--filter-config, --disabled to pause it) |
duvo agents triggers delete <agent-id> <trigger-id> | Delete an event trigger and its filter config (-y, --json) |
duvo agents memory files <agent-id> | List an agent's memory files (duvo agents memory <agent-id> also works) |
duvo agents memory file-get <agent-id> <path> | Print the contents of one memory file (streams to stdout) |
duvo agent-folders list | List agent folders for your team |
duvo agent-folders create | Create an agent folder |
duvo agent-folders update <id> | Rename or move an agent folder |
duvo agent-folders delete <id> | Delete an agent folder |
duvo agent-folders move-agents | Move agents into a folder or to root |
duvo automations list | List automations for your team |
duvo automations get <id> | Get an automation by ID |
duvo automations create --name <name> | Create an automation (its first agent is created alongside it) |
duvo automations rename <id> --name <name> | Rename an automation |
duvo automations duplicate <id> (alias clone) | Duplicate an automation into a "Copy of …" automation from its live agents, queues and routing; your triggers and schedules are copied switched off (--json) |
duvo automations delete <id> | Delete an automation (its agents and queues stop dispatching) |
duvo automations current <id> | Show what an automation is set up to do right now (agents, queues, triggers, schedules) |
duvo automations flow <id> | Show an automation's current flow graph (agents, queues, handovers) |
duvo automations readiness <id> | Show what still has to be set up before an automation can run on real work |
duvo automations dashboard-data <id> | Show a Module's dashboard figures, computed as the dashboards compute them (--dashboard, --range, --time-zone) |
duvo automations roles <id> | List an automation's process roles and who holds them |
duvo automations add-member <id> --email <email> --role <key> | Put someone in a process role (emails them; asks first unless --yes) |
duvo automations policy <id> | Show an automation's whole Policy, the same one Ask Duvo reads |
duvo automations assign-interview <id> | Assign a Policy interview (--email, --context; asks first unless --yes) |
duvo automations tabs <id> | Show an automation's tab arrangement and pinned Pulse dashboards |
duvo attributes list | List the team's attributes (like Severity or Cost), their values and how many processes hold each |
duvo attributes create --name <n> --type <t> | Create a select (--value, repeatable), number (--unit) or text attribute |
duvo attributes update <attribute-id> | Rename an attribute, change its unit, or add and remove select values |
duvo attributes delete <attribute-id> | Delete an attribute, clearing it from every automation (asks first unless --yes) |
duvo attributes values --automation <id> | Show the attribute values an automation holds (or --process <id>) |
duvo attributes automations | List the team's automations with their values (--attribute, --value to keep only holders) |
duvo attributes set <attribute-id> --automation <id> | Set an automation's value (--value, --number or --text) |
duvo attributes clear <attribute-id> --automation <id> | Clear an automation's value for an attribute |
duvo runs start --agent <id> | Start a new run for the given agent; add --follow to stream messages until it ends |
duvo runs list | List Runs for your team. Add --count-only to return only the matching total. |
duvo runs get <id> | Get an agent run by ID |
duvo runs evaluation <run-id> | Get the latest evaluation for a run, with Agent-specific rubrics labelled by title (resolves the agent automatically) |
duvo runs messages <id> | List messages for a run; add --follow to poll for new messages until the run ends |
duvo runs send-message <id> --message <text> | Post a message to an agent run |
duvo runs respond <run-id> [request-id] | Respond to a human-in-the-loop request on a run (defaults to the pending request) |
duvo runs stop <id> | Stop a running agent run |
duvo suggestions list <agent-id> | List an Agent's suggestions (--status pending is the inbox; --status history shows resolved) |
duvo suggestions consume <suggestion-id> | Apply a suggestion: stage its change onto the Agent's draft revision |
duvo suggestions reject <suggestion-id> | Dismiss a pending suggestion |
duvo sandboxes create | Create a sandbox for staging files |
duvo sandboxes files <id> | List files in a sandbox directory |
duvo sandboxes upload <id> <file> | Upload a local file (max 10MB) |
duvo sandboxes prepare-upload-url <id> --path <p> | Get a presigned upload URL |
duvo cases list --queue <id> | List Cases in a Queue. Add --count-only to return only the matching total. |
duvo cases search --queue <id> | Search Cases in a Queue with richer filters than list: --label "<key=value|value>" (repeatable; values for the same key are ORed, different keys ANDed) and structured --field filters, all ANDed with list's other filters |
duvo cases get <id> | Get a case by ID with its event history |
duvo cases create --queue <id> | Create one or more cases (--title for one or --from-file with a JSON array) |
duvo cases delete <id> | Delete a case (interrupts any associated active runs) |
duvo cases clear --queue <id> | Delete every case in a queue (interrupts active runs first) |
duvo cases bulk-delete --queue <id> --ids <list> | Delete multiple cases from a queue (1-100; interrupts active runs first) |
duvo cases bulk-reprocess --queue <id> --agent <id> --ids <list> | Re-process cases on a queue consumer agent (1-100; interrupts active runs; see duvo queues agents) |
duvo cases bulk-update-status --queue <id> --ids <list> | Update the status of multiple cases to completed or failed (1-100) |
duvo cases runs <case-id> | List runs (agent runs) that have worked on a case |
duvo cases labels list <case-id> --queue <id> | List labels assigned to a case |
duvo cases labels assign <case-id> --queue <id> --label "<key=value|value>" [...] | Assign labels to a case (--label repeatable, accepts key=value or tag-only value) |
duvo cases labels unlink <case-id> --queue <id> --label-id <label-id> [...] | Remove labels from a case (--label-id repeatable) |
duvo notifications list | List notifications for your team, most recent first (--type, --unread, --important, --severity, --batch, --sort, cursor pagination) |
duvo notifications get <id> | Get a notification by ID |
duvo notifications feed | List the notification feed for your team (individual notifications interleaved with per-agent batches), most recent activity first (--type, --unread, cursor pagination) |
duvo notifications get-batch <id> | Get a notification batch by ID, with per-type live-member counts, unread count, and worst severity |
duvo notifications counts | Get per-type notification counts for your team (--unread to count unread only) |
duvo notifications unread-count | Get the unread notification count for your team |
duvo notifications mark-read <id> | Mark a notification as read |
duvo notifications mark-batch-read <id> | Mark every unread live member of a notification batch as read (--types to narrow) |
duvo notifications mark-all-read | Mark all notifications as read for your team |
duvo notifications dismiss <id> | Dismiss an important (unresolved connection_broken) notification |
duvo notifications delete-read | Delete all read notifications for your team |
duvo notifications delete-all | Delete all notifications, read and unread, for your team |
duvo clarity list | List Clarity processes |
duvo clarity search <query> | Search Clarity processes |
duvo clarity status <process-id> | Show process status, generation progress, and selected version IDs |
duvo clarity overview <process-id> | Show a summary-first Clarity overview with health, counts, warnings, and next commands |
duvo clarity versions <process-id> | List v2 current/proposal histories, selected versions, and proposal anchors |
duvo clarity current <process-id> | Read a v2 current-process snapshot |
duvo clarity proposal <process-id> | Read a v2 transformation-proposal snapshot |
duvo clarity compare <process-id> | Compare selected v2 current-process and proposal snapshots |
duvo clarity captures <process-id> | List captures attached to a Clarity process |
duvo clarity capture <process-id> <capture-id> | Read one capture attached to a Clarity process |
duvo clarity gaps <process-id> | Group v2 proposal gaps and extra-capture requests by step |
duvo clarity evidence <process-id> | Print v2 current-process evidence sources; add --citation <id> to resolve one source |
duvo clarity readiness <process-id> | Summarize v2 automation-readiness ratings |
duvo clarity facets <process-id> | Build structured cost, risk, lineage, and automation facets for agents |
duvo clarity export <process-id> | Export Clarity context as Markdown or JSON |
duvo clarity doctor [process-id] | Check auth/API/tool readiness and, when provided, process context health |
duvo clarity tools | List Clarity tools with CLI commands and underlying public API endpoints |
duvo clarity artifact-chat-conversations <process-id> --snapshot-kind <kind> | List artifact-chat conversations for a current-process or transformation-proposal view |
duvo clarity artifact-chat-messages <process-id> <conversation-id> | Read messages for one artifact-chat conversation |
duvo clarity generate-current-process <process-id> | Start current-process generation |
duvo clarity generate-transformation-proposal <process-id> | Start transformation-proposal generation or regeneration |
duvo clarity promote-current-process <process-id> <snapshot-id> | Promote a current-process snapshot to live |
duvo clarity promote-transformation-proposal <process-id> <proposal-id> | Promote a transformation-proposal snapshot to live |
duvo clarity revert-current-process <process-id> <snapshot-id> | Delete a current-process snapshot |
duvo clarity revert-transformation-proposal <process-id> <proposal-id> | Delete a transformation-proposal snapshot |
duvo clarity assign-extra-capture-request <process-id> <proposal-id> <request-id> | Assign or unassign an extra-capture request |
duvo clarity postprocess <process-id> <snapshot-type> <snapshot-id> | Re-run postprocessing for a current-process or transformation-proposal snapshot |
duvo clarity build-automation <process-id> | Start automation generation from the latest proposal |
duvo clarity stop-transformation-proposal <process-id> | Stop in-flight transformation-proposal generation |
duvo clarity create [--name <name>] [--json] | Create a new Clarity v2 process for the current team |
duvo clarity create-invite-link <process-id> | Create or regenerate an interview invite link |
duvo clarity import-artifact <process-id> <file> | Import a local Miro SVG, XML, PNG, or JPEG export |
duvo queue-labels list --queue <queue-id> | List labels defined on a queue (with case counts) |
duvo queue-labels create --queue <queue-id> --value <v> | Create a label on a queue (--value required) |
duvo queue-labels update <label-id> --queue <queue-id> --value <v> | Rename a label or change its color (--value required) |
duvo queue-labels delete <label-id> --queue <queue-id> | Delete a label and remove it from all cases |
duvo files list | List team files |
duvo files upload-url | Get a presigned upload URL for a team file |
duvo files download-url <path> | Get a presigned download URL |
duvo files content <path> | Print the content of a text file |
duvo files content-set <path> | Update the content of a text file |
duvo files rename | Rename a team file |
duvo files delete <path> | Delete a team file |
duvo revisions list --agent <id> | List revisions for an agent |
duvo revisions get <id> --agent <id> | Get a revision by ID |
duvo revisions create --agent <id> --name <text> | Create a new revision for an existing agent from --config-file, --code, or --aop-file with --source-revision |
duvo revisions update <id> | Update a revision's config from --config-file, or replace only its AOP with --aop-file (handover targets are derived from the AOP) |
duvo integrations list | List the team's integration catalog |
duvo integrations custom create --name <n> --auth-method <m> --server-url <url> | Create a custom integration type in your team's catalog |
duvo integrations custom delete <custom-integration-id> | Delete a custom integration type (cascade-removes related connections) |
duvo connections list | List your connections (filter with --type) |
duvo connections get <id> | Get one of your connections by ID |
duvo connections create | Create a user-provided connection (custom MCP server) |
duvo connections update <id> | Update a connection (name, server URL, headers, sharing) |
duvo connections delete <id> | Delete a connection and any triggers bound to it |
duvo connections credentials <id> | List configured header keys (sensitive values redacted) |
duvo oauth native start <provider> | Start a native OAuth connection (Gmail, Outlook, ...). Prints the authorization URL. |
duvo oauth mcp probe <url> | Probe an MCP server URL and list tools it exposes (--header KEY=VALUE repeatable). |
duvo oauth mcp authorize --url <url> --name <n> | Start an OAuth-based connection with a remote MCP server (DCR). Prints the auth URL. |
duvo oauth mcp check --url <url> | Probe an MCP server URL for OAuth Dynamic Client Registration support. |
duvo revision-integrations list | List integrations attached to a revision (shows SLOT ID and INTEGRATION ID columns) |
duvo revision-integrations attach | Attach one or more integrations to a revision |
duvo revision-integrations remove <integration-id> | Remove an integration slot from a revision |
duvo revision-integrations connections list | List your pinned connections for a revision's integration slot |
duvo revision-integrations connections pin <id> | Pin one of your connections to a revision's integration slot |
duvo revision-integrations connections unpin <id> | Unpin a connection from a revision's integration slot |
duvo secrets list | List env-var secrets visible to you (team-shared plus personal) |
duvo secrets get <id> | Get an env-var secret by ID (values are never exposed) |
duvo secrets create --name <n> --value KEY=VAL | Create an env-var secret (--shared to make it team-shared) |
duvo secrets update <id> | Update a secret (--set, --remove, --rename, metadata fields) |
duvo secrets delete <id> | Soft-delete an env-var secret |
duvo credentials list [--domain <d>] | List browser logins (passwords and OTP secrets are never returned) |
duvo credentials get <id> | Get a browser login by ID |
duvo credentials create --domain <d> [--password <p>] [--otp-secret <s>] | Create a browser login. The OTP value must be a base32 TOTP setup secret or an otpauth URI. |
duvo credentials update <id> | Update a browser login |
duvo credentials delete <id> | Delete a browser login |
duvo revision-secrets list --agent <id> --revision <id> | List env-var secrets attached to a revision |
duvo revision-secrets attach --agent <id> --revision <id> --secret <id> | Attach an env-var secret to a revision |
duvo revision-secrets detach <secret-id> --agent <id> --revision <id> | Detach an env-var secret from a revision |
duvo revision-logins list --agent <id> --revision <id> | List browser logins attached to a revision |
duvo revision-logins attach --agent <id> --revision <id> --credential <id> | Attach a browser login to a revision |
duvo revision-logins detach <credential-id> --agent <id> --revision <id> | Detach a browser login from a revision |
duvo plugins list | List plugins referenceable by name in a revision |
duvo queues list | List queues for your team |
duvo queues get <id> | Get a queue by ID |
duvo queues create --name <name> |