MOLTED EMAIL
CLI Reference

molted agents

Multi-agent coordination

CommandDescription
molted agents registerRegister an agent
molted agents heartbeatSend agent heartbeat
molted agents leaseAcquire a resource lease
molted agents release-leaseRelease a resource lease
molted agents leasesList active leases
molted agents consensus createCreate a consensus request
molted agents consensus getGet consensus request details
molted agents consensus voteVote on a consensus request
molted agents configGet agent config
molted agents update-configUpdate agent config (humanizer_enabled, humanizer_style)

Agent context

The agents system enables multiple AI agents to coordinate within a single tenant. It provides registration, heartbeats, resource leasing, consensus voting, and per-agent configuration.

Register your agent (run once at startup)

molted agents register --agent-name "outreach-agent" --agent-role outbound \
  --metadata '{"version": "1.0", "owner": "team-a"}'
# → { "id": "agent_...", ..., "apiKeyBinding": "bound" }
# By default this binds your API key to the new agent (#1945), so
# 'molted agents update-config' for this agent applies to this key's sends.
# Binding is PERMANENT for a key: apiKeyBinding is "already_bound" on a
# re-register, "bound_to_other_agent" if this key is already bound
# elsewhere, or "agent_has_other_key" if a different key already answers
# for this agent -- in either case nothing is re-pointed, a warning prints
# on stderr, and the command still exits 0 (registration itself succeeded).
# To use a different agent, register a new API key. "not_requested" is
# --no-bind-key; "not_applicable" means there was no API key to bind.

Send heartbeats (run periodically to signal liveness)

molted agents heartbeat --agent-id <id>
molted agents heartbeat --agent-name "outreach-agent"
# → { "ok": true }
# Only agents with a heartbeat (or register) in the last 5 minutes count
# toward a consensus majority.

Resource leasing (prevent two agents from working on the same contact):

molted agents lease --agent-id <id> --contact-email alice@example.com \
  --intent outbound_sales --duration 30
# → { "id": "<uuid>", "agentId": "agent_...", "contactEmail": "alice@example.com",
#     "intent": "outbound_sales", "expiresAt": "...", ... }
# → if another agent holds the lease (still a success response):
#   { "conflict": true, "leaseHolder": { "agentId": "...", "agentName": "...", "expiresAt": "..." } }
# Leasing again with the same agent extends its lease.

molted agents release-lease <leaseId>     # release early when done → { "released": true }
molted agents leases                       # list all active leases

Consensus voting (multi-agent decisions)

molted agents consensus create --agent-id <id> --action "pause campaign" \
  --contact-email ceo@bigcorp.com --reason "Fatigue scores are high"
# → { "id": "<uuid>", "action": "pause campaign", "status": "pending", "timeoutAt": "...", ... }

molted agents consensus get <consensusId>
# → { "id": "<uuid>", "action": "pause campaign", "status": "pending", ... }

molted agents consensus vote <consensusId> \
  --agent-id <id> --vote "approve" --reason "Agreed"
# → { "id": "<uuid>", "vote": "approve", "consensusStatus": "pending", ... }
# consensusStatus turns "approved" or "rejected" once that side has votes from
# at least half of the active agents (rounded up). A second vote from the same
# agent replaces its first. A request still pending at timeoutAt turns
# "expired" within about 15 minutes (a background sweep); until then it stays
# "pending" and takes votes. Statuses: pending, approved, rejected, expired.
# Votes cast after a decision or expiry are still counted and can change it.

Per-agent configuration (humanizer settings only; overrides the account's):

molted agents config <agentId>
molted agents update-config <agentId> --config '{"humanizer_enabled": false}'
# Keys: humanizer_enabled, humanizer_style (others are dropped; a config with
# no known key fails). Merged into the stored config. Turning the humanizer off
# is always allowed; any other change is a human decision (human gate), and
# turning it on needs a plan that includes it.

Related: molted adopt, molted overrides, molted send

Commands

molted agents register

Register an agent

molted agents register [options]
OptionDescriptionDefault
--agent-name <name>Agent name (required) (required)
--agent-role <role>Agent role (e.g. outbound, inbound, classifier; default general)
--metadata <json>Agent metadata (JSON object; accepted but not stored by the server today)
--no-bind-keyDo not bind this API key to the newly registered agent (bound by default, #1945)

molted agents heartbeat

Send agent heartbeat

molted agents heartbeat [options]
OptionDescriptionDefault
--agent-id <id>Agent ID
--agent-name <name>Agent name (resolved to ID server-side)

molted agents lease

Acquire a resource lease

molted agents lease [options]
OptionDescriptionDefault
--agent-id <id>Agent ID
--agent-name <name>Agent name (resolved to ID server-side)
--contact-email <email>Contact email for the lease (required) (required)
--intent <intent>Lease intent (e.g. outbound_sales; default general)
--duration <minutes>Lease duration in minutes (default 30)

molted agents release-lease

Release a resource lease

molted agents release-lease <id>
ArgumentDescriptionRequired
<id>yes

molted agents leases

List active leases

molted agents leases

molted agents consensus create

Create a consensus request

molted agents consensus create [options]
OptionDescriptionDefault
--agent-id <id>Requesting agent ID
--agent-name <name>Requesting agent name (resolved to ID server-side)
--action <action>Proposed action (required) (required)
--contact-email <email>Contact email (required) (required)
--reason <reason>Reason for the request (required) (required)
--timeout <minutes>Minutes until the request's timeoutAt (default 5); a still-pending request turns expired within about 15 minutes after it

molted agents consensus get

Get consensus request details

molted agents consensus get <id>
ArgumentDescriptionRequired
<id>yes

molted agents consensus vote

Vote on a consensus request

molted agents consensus vote [options] <id>
ArgumentDescriptionRequired
<id>yes
OptionDescriptionDefault
--agent-id <id>Voting agent ID (required) (required)
--vote <option>Your vote (approve or reject) (required) (required)
--reason <reason>Reason for vote

molted agents config

Get agent config

molted agents config <agentId>
ArgumentDescriptionRequired
<agentId>yes

molted agents update-config

Update agent config (humanizer_enabled, humanizer_style)

molted agents update-config [options] <agentId>
ArgumentDescriptionRequired
<agentId>yes
OptionDescriptionDefault
--config <json>Config object (JSON) (required) (required)

See CLI overview for global options, credentials and output format.