use super::OnboardingStep;
pub const ONBOARD_SUBCOMMANDS: &[(&str, OnboardingStep)] = &[
("provider", OnboardingStep::ProviderAuth),
("workspace", OnboardingStep::Workspace),
("channels", OnboardingStep::Channels),
("voice", OnboardingStep::VoiceSetup),
("image", OnboardingStep::ImageSetup),
("daemon", OnboardingStep::Daemon),
("brain", OnboardingStep::BrainSetup),
];
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DeepLink {
FullWizard,
Step(OnboardingStep),
Unknown(String),
}
pub fn resolve<'a>(command: &str, input: &'a str) -> (DeepLink, &'a str) {
if command == "/doctor" {
return (DeepLink::Step(OnboardingStep::HealthCheck), "");
}
let suffix: &'a str = if command == "/models" {
"provider"
} else {
input
.strip_prefix("/onboard")
.unwrap_or("")
.trim_start_matches(':')
};
let mut parts = suffix.split_whitespace();
let head = parts.next().unwrap_or("");
let arg = parts.next().unwrap_or("");
if head.is_empty() {
return (DeepLink::FullWizard, "");
}
match ONBOARD_SUBCOMMANDS.iter().find(|(name, _)| *name == head) {
Some((_, step)) => (DeepLink::Step(*step), arg),
None => (DeepLink::Unknown(head.to_string()), ""),
}
}
pub fn unknown_suffix_message(suffix: &str) -> String {
let valid = ONBOARD_SUBCOMMANDS
.iter()
.map(|(name, _)| format!("`/onboard:{name}`"))
.collect::<Vec<_>>()
.join(", ");
format!(
"⚠️ Unknown onboarding subcommand `{suffix}`. Valid: {valid}. \
Bare `/onboard` runs the full wizard, `/doctor` runs the health check."
)
}