use sim_kernel::Symbol;
pub const INTENT_NAMESPACE: &str = "intent";
pub const KIND_KEY: &str = "kind";
pub const ORIGIN_KEY: &str = "origin";
pub const OPERATOR_KEY: &str = "operator";
pub const AT_TICK_KEY: &str = "at-tick";
pub const INTENT_KINDS: &[&str] = &[
"tap",
"select",
"edit-field",
"move",
"wire",
"unwire",
"create",
"delete",
"invoke",
"set-lens",
"set-mode",
"open",
"commit",
"cancel",
"scrub",
"set-param",
"performance-event",
"piano-roll-edit",
"player-rack-edit",
"arranger-edit",
"approve",
"reject",
"ask",
"split-mission",
"pause-agent",
"rerun-validation",
"replay-cassette",
"open-source",
];
pub fn intent_kind(name: &str) -> Symbol {
Symbol::qualified(INTENT_NAMESPACE, name)
}
pub fn is_known_kind_name(name: &str) -> bool {
INTENT_KINDS.contains(&name)
}
pub fn is_known_kind(symbol: &Symbol) -> bool {
symbol.namespace.as_deref() == Some(INTENT_NAMESPACE) && is_known_kind_name(&symbol.name)
}
pub fn required_fields(kind_name: &str) -> &'static [&'static str] {
match kind_name {
"tap" => &["target", "control"],
"select" => &["targets"],
"edit-field" => &["target", "path", "value"],
"move" => &["node", "at"],
"wire" => &["from", "to"],
"unwire" => &["edge"],
"create" => &["class", "at", "args"],
"delete" => &["targets"],
"invoke" => &["target", "op", "args"],
"set-lens" => &["pane", "lens"],
"set-mode" => &["mode"],
"open" => &["value", "pane"],
"commit" => &["pane"],
"cancel" => &["pane"],
"scrub" => &["target", "at"],
"set-param" => &["target", "param", "value"],
"performance-event" => &["target", "source", "input", "event"],
"piano-roll-edit" => &["target", "action"],
"player-rack-edit" => &["target", "action"],
"arranger-edit" => &["target", "action"],
"approve" => &["mission"],
"reject" => &["mission"],
"ask" => &["mission", "question"],
"split-mission" => &["mission", "goals"],
"pause-agent" => &["mission"],
"rerun-validation" => &["mission"],
"replay-cassette" => &["mission", "at"],
"open-source" => &["location"],
_ => &[],
}
}