Channel-Native UI

Calciforge keeps text commands as the portable interface, then adds native controls when a channel can render them reliably. A button press, list choice, approval decision, or form link must call the same backend command handler as the text command so the behavior stays identical across direct clients, bridged clients, and text-only channels.

The channel with the best controls does not have to be the channel where the conversation happens. For example, an operator can keep Telegram open as a Calciforge control panel for !agent, !model, !session, approval, and !secret flows while chatting with the same routed agent over Matrix, WhatsApp, Signal, or SMS. Active agent, model, and session selections are keyed by Calciforge identity, so the operator’s choices follow them across channels.

Use ui_mode = "auto" to allow native controls where supported. Use ui_mode = "text" when a client or bridge renders native controls poorly, such as WhatsApp through a Matrix bridge.

Rendered Mockups and Targets

These illustrations are rendered mockups for docs and planning. They show the intended user experience and the current implementation boundary; they are not captured screenshots from Telegram, Matrix, Signal, or WhatsApp clients unless explicitly labeled that way.

Telegram agent selection with inline buttons
Telegram can render agent choices as inline buttons.
Telegram model selection with inline buttons
Model routes use the same command backend as !model use <id>.
Matrix text fallback for agent and model choices
Matrix currently uses deterministic text fallback for bridge-safe operation.
Signal text fallback for agent and model choices
Signal is high priority, but remains text-first until native controls are proven.
WhatsApp native selection target requiring a compatible backend
WhatsApp native lists/buttons are a target, not current embedded-channel behavior.

Capability Model

Capability Native examples Text fallback
Choice Telegram inline keyboard, WhatsApp list/reply buttons, RCS suggested replies Labeled options with !agent switch <id>, !model use <id>, or !switch <agent> <session>
URL/form Telegram URL button, RCS open URL action Plain HTTPS link
Confirm Yes/no quick replies or buttons !approve <id> / !deny <id>
Artifact Native image, audio, video, or file delivery Artifact name, size, and safe next action

Channel Notes