Pick mode for the legacy modal picker chain (FirstRun only β the
Ctrl+A path now uses the dashboard via run_audio_settings_page).
Reconfigure is kept so the older code paths that still take a
PickMode parameter compile cleanly even though nothing constructs it.
Atlas contract ids for the audio primitives that have user-visible
device choices on a multi-provider host (e.g. local ALSA driver vs
the macOS bridge). asr/tts are software backends with one provider
per box, so we donβt prompt for them.
The standard LLM-facing capability name, exactly as pilot presents it to
the model and as the model emits it in do.cap: provider_id.<area>_<leaf>
β e.g. tiago_camera.camera_snapshot, tiago_lidar.lidar_snapshot,
explore.explore_status, executor.builtin_read_file. The <area>_<leaf>
part mirrors robonix_pilot::discovery::llm_name (kept in sync here since
rbnx-cli doesnβt depend on the pilot crate); the <area> prefix is what
disambiguates the shared snapshot / status leaves across providers.
Compact one-line label for a do node: provider.leaf(short args).
Collapses whitespace/newlines (run_command args are whole shell scripts)
and elides past ~48 chars so the tree stays readable in both the log and
the panel.
Best-effort audio device discovery. Anything that goes wrong here
(atlas unreachable, no providers registered, user pressed Esc) is
downgraded to a chat-history warning β text mode keeps working.
Render a single-line status page and pause briefly so the user can
read it before the next picker step (or the chat) takes over the
screen. Long messages now sit for 1.4 s β the previous 400 ms felt
like βthe page just flashed and disappeared.β
Pilot/Liaison bind IPv4 (0.0.0.0). Resolving localhost often prefers
::1, so the gRPC client hits IPv6 and gets connection refused β force IPv4 loopback.
True iff atlas currently has a provider whose id (or namespace) matches the
pin AND it provides contract over GRPC. Used at chat startup to detect
stale pins from a prior deploy whose audio provider has since been renamed
or removed β caller drops the pin and re-prompts the picker instead of
silently letting voice fail with βno providerβ.
Submit text as a mid-task steer on an already-running session. Pilot routes
it to the live turnβs steer queue and returns an empty stream, which we drain.
Fire-and-forget a mid-turn VOICE steer (Ctrl+V during a running turn):
record + ASR another utterance via a fresh voice session and let its
transcript submit β Pilot steers it into the active turn. TTS is disabled
here (the per-segment playback rides the main turnβs stream); we just drain
this sessionβs events on a spawned task.
Ok(Some((provider_id, device_id))) = picked both layers; device_id may be ββ
when the impl returned UNIMPLEMENTED on list_devices.
Ok(None) = no providers in atlas.
Same as voice_node but falls back to cfg_value (from chat.yaml)
when the env var is unset / empty. Empty result still means βlet
liaison auto-pick from atlasβ.
Tiny username probe β avoids pulling in whoami for the CLI by reading
$USER/$USERNAME with a βuserβ fallback. Liaison uses the real whoami
crate when it stamps the canonical local:<user> identity.