Sleeptalk

Operate

Call lifecycle and recovery

Inspect the current attempt before retrying a lost or failed call start.

Foreground and detached calls

CallRuns asEnd it with
sleeptalk --terminalAttached to your terminalq or Ctrl+C
sleeptalk --webAttached to your terminal, opened on localhostEnding the call in the browser, or Ctrl+C
Agent link (host start-voice)A detached call with a host-owned call IDThe browser, or sleeptalk host stop
DiscordThe bot's own runtime or service/<profile> leave; stop the runtime or service to take the bot offline
List detached browser calls
sleeptalk host list

Use sleeptalk host stop CALL_ID with the ID of the intended call. On a tailnet call, stopping also removes the tailscale serve entry. Stopping a call is different from cancelling a background agent task or removing an OS service.

Why a call ended

ReasonWhat happenedNext step
SilenceNo speech for 90 secondsAsk for a new link
Hosted time limitThe hosted relay's 30-minute limit; the page warns 2 minutes and 30 seconds beforeAsk for a new link, or use a tailnet or local call, which have no limit
Expired linkThe link was not opened within its lifetime (five minutes at most)Ask for a new link
Used linkSomeone already opened itAsk for a new link; treat the old one as spent
Relay allowance reachedThe hosted service's daily budget refused the callTry later, or use a tailnet or local call

Recover a browser start

For automation, give each start a stable request ID and the same profile and workspace. This example asks for a local browser call:

Replace the example paths before running
sleeptalk host start-voice web \
  --config /path/to/profile.toml \
  --workspace /path/to/project \
  --caller-context local --request-id call-001 --json

For a link delivered through chat, pass that chat integration's name as --caller-context. The receipt's delivery field says how the link travels: local, tailnet, or hosted_relay. The request ID identifies this attempt, not every future call.

Inspect the same attempt without returning the join link
sleeptalk host status --config /path/to/profile.toml --request-id call-001

If the first response was lost, repeat the exact start arguments and request ID. An unused, still-valid link is recovered without creating a second call. The original expiry stays in effect.

Changed arguments or profile contents produce a conflict. Ended, used, or expired attempts report their state instead of silently launching a duplicate. Use a new request ID for a genuinely new call after reviewing that state.

Recover interrupted setup

Private key entry, phone setup, and call starts use separate request IDs. Check a setup request with sleeptalk host input status --request-id <id>, or block until it finishes with sleeptalk host input wait --request-id <id>.

Setup resultNext action
WaitingLet the user continue in the open private page.
Interrupted local inputRetry the same start once, with the same choices, as its receipt directs.
Expired or cancelled inputStart a new request. Matching validated credentials can be reused.
Interrupted phone linkCreate a new request ID and send the new link.
Complete, profile readyGo on to the call start. This does not prove an audible exchange.

Cancelling keeps credentials that were already saved. Never retry a rejected key, permission denial, or identity mismatch in a loop. Follow the receipt's next_action.

Tailnet start failures

A tailnet start that cannot publish fails before any link exists, with a code such as tailscale_not_running or tailscale_https_disabled. It never falls back to the hosted relay. Fix the cause and start again. See calls over your tailnet.

Diagnose before retrying

Inspect a saved profile
sleeptalk doctor --config /path/to/profile.toml --json

Doctor's live checks contact configured services and can use provider credit. Add --offline for local checks only. Use the stable check IDs to see which prerequisite failed.

A ready profile, a running process, or a media_playing event does not prove that a person heard the right response. Verify a spoken workspace question, a reply, Stop, and a new call.